Я пытаюсь выполнить следующее:
- откройте gnome-terminal с помощью сочетания клавиш, скажем, Ctrl+Shift+E.
- Запустите команду в терминале. Для конкретности команда
gio open $(fzf)
. Команда интерактивна и запускает внешнюю программу (например, evince). - После запуска внешней программы закройте терминал, не закрывая внешнюю программу.
Команда, которая меня интересует для шага 2 выше, выглядит так gio open $(fzf)
: я выбираю файл с помощью fuzzy finder fzf
, а затем команда gio open
открывает этот файл с помощью программы по умолчанию gnome.
Я могу выполнить три шага, описанных выше, один за другим:
- Я могу назначить сочетание клавиш в настройках
gnome-terminal
: Оно открывает терминал, как и ожидалось. - Затем я ввожу в открывшийся терминал команду
gio open $(fzf)
: Если я выбираю файл PDF изfzf
, он открывается вместе с выбранным файлом. - Я могу нажать Ctrl+D, чтобы закрыть терминал. Это действие ненетблизкое проявление. Это предполагаемое поведение.
и выполнение этих трех шагов вручную работает.
Моя цель — автоматизировать вышеперечисленное.Это должно работать следующим образом. Когда я нажимаю сочетание клавиш Ctrl+Shit+E (или любое другое), должен открыться gnome-terminal, и команда gio open $(fzf)
должна быть запущена. Как только интерактивная команда будет выполнена (которая открывает внешнюю программу, такую как evince), терминал должен автоматически закрыться, не закрывая evince.
Что я пробовал.
- Добавление сочетания клавиш с командой
gnome-terminal -- bash -c "gio open $(fzf)"
не работает. Нажатие сочетания клавиш ничего не делает. - Если я добавлю команду
gio open $(fzf)$
в конец моего .bashrc, сочетание клавиш с командойgnome-terminal
откроет терминал и команда будет запущена. Как только я выберу файл pdf, откроется evince с выбранным файлом (да!!!). Но затем, если я нажму Ctrl+D, терминал закроется, и evince тоже (может быть, потому что evince — это подпроцесс?). - Если я добавлю команду
gio open $(fzf)$ && exit
в конец моего .bashrc, сочетание клавиш с командойgnome-terminal
откроет терминал, и команда будет выполнена, но как только я выберу файл, терминал закроется, не открыв evince (evince мог запуститься и сразу же закрыться, я не могу сказать точно).
Обратите внимание, что эксперименты с .bashrc проводились в основном в целях тестирования, мне бы хотелось избежать загрязнения моего .bashrc.
решение1
Но затем, если я нажму Ctrl+D, терминал закроется, а вместе с ним и evince (может быть, потому, что evince — это подпроцесс?)
Да, конечно, это подпроцесс и вам следует запустить этот процесс как "отсоединенный". После этого вы можете завершить основной процесс (в вашем случае - терминал).
Вот подробный ответ о том, как запускать отдельные процессы.
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
В качестве другого способа вы можете использовать следующую комбинацию клавиш:
bash -c "some_command" > /dev/null &2>&1
В этом случае окно терминала вообще не будет открываться, и вам не нужно ничего добавлять в файл .bashrc.
решение2
То же самое беспокоило меня, поэтому я отвечу на этот старый вопрос. Я нашел это xdg-open
и gio open
столкнулся с проблемами с таким типом скрипта, и я также заметил, что gnome-terminal испытывает с этим проблемы. Например, xdg-open может открыть gedit для редактирования текстовых файлов, но не evince для просмотра pdf-файлов. Поэтому я использую следующий скрипт с xterm -e
. Обратите внимание, что это оставит файлы nohup.out в вашем домашнем каталоге, вы можете перенаправить stdout, если это вас беспокоит.
#!/bin/bash
file="$(fzf)"
[ - n "$file" ] || exit 1
end="${file##*.}"
case $end in
pdf | djvu | ps )
exec nohup evince "$file"
;;
* )
exec nohup xdg-open "$file"
;;
esac