Запустите терминал с помощью сочетания клавиш, выполните интерактивную команду и выйдите в Ubuntu 17.10

Запустите терминал с помощью сочетания клавиш, выполните интерактивную команду и выйдите в Ubuntu 17.10

Я пытаюсь выполнить следующее:

  1. откройте gnome-terminal с помощью сочетания клавиш, скажем, Ctrl+Shift+E.
  2. Запустите команду в терминале. Для конкретности команда gio open $(fzf). Команда интерактивна и запускает внешнюю программу (например, evince).
  3. После запуска внешней программы закройте терминал, не закрывая внешнюю программу.

Команда, которая меня интересует для шага 2 выше, выглядит так gio open $(fzf): я выбираю файл с помощью fuzzy finder fzf, а затем команда gio openоткрывает этот файл с помощью программы по умолчанию gnome.

Я могу выполнить три шага, описанных выше, один за другим:

  1. Я могу назначить сочетание клавиш в настройках gnome-terminal: Оно открывает терминал, как и ожидалось.
  2. Затем я ввожу в открывшийся терминал команду gio open $(fzf): Если я выбираю файл PDF из fzf, он открывается вместе с выбранным файлом.
  3. Я могу нажать 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

Связанный контент