Прежде всего, как только вы запустили процесс, вы можете сделать его фоновым, сначала остановив его (нажмите Ctrl-Z), а затем набрав bg
, чтобы он возобновился в фоновом режиме. Теперь это “задание”, и его stdout
/stderr
/stdin
все еще подключены к вашему терминалу.
Можно сразу же начать процесс в фоновом режиме, добавив к его концу “&”:
firefox &
Чтобы запустить его в фоновом режиме без звука, используйте следующее:
firefox </dev/null &>/dev/null &
Дополнительная информация:
nohup
это программа, которую вы можете использовать ** для запуска вашего приложения с ** таким образом, что его stdout/stderr может быть отправлен в файл вместо этого, и так, что закрытие родительского скрипта не будет SIGHUP дочернего. Тем не менее, вы должны были иметь предвидение, чтобы использовать его до того, как вы запустили приложение. Из-за того, как работает nohup
, вы не можете просто приложить его к запущенному процессу.
disown
- это bash builtin, который удаляет задание оболочки из списка заданий оболочки. По сути, это означает, что вы больше не можете использовать fg
, bg
в ней, но, что более важно, когда вы закрываете оболочку, она больше не будет зависать или посылать SIGHUP
этому дочернему процессу. В отличие от nohup
, disown
используется после запуска процесса и в фоновом режиме.
Что вы не можете сделать, так это изменить stdout/stderr/stdin процесса после его запуска. По крайней мере, не из оболочки. Если вы запускаете процесс и говорите ему, что его stdout - ваш терминал (что вы и делаете по умолчанию), то этот процесс настроен на вывод на ваш терминал. Ваша оболочка не имеет никакого отношения к настройке FD процессов, это чисто то, чем управляет сам процесс. Сам процесс может решить, закрыть его stdout/stderr/stdin или нет, но вы не можете использовать оболочку, чтобы заставить его это сделать.
Для управления выводом фоновых процессов, у вас есть множество опций из скриптов, “nohup”, вероятно, приходит на ум первым. Но для интерактивных процессов, которые вы начинаете, но забыли заставить замолчать (firefox < /dev/null &>/dev/null &
), на самом деле, вы не можете сделать много.
Я рекомендую вам получить GNU screen
. С помощью экрана вы можете просто закрыть вашу выполняющуюся оболочку, когда вывод процесса становится беспокойным, и открыть новую (^Ac
).
О, и, кстати, не используйте “$@
” там, где вы его используете.
$@
означает, $1
, $2
, $3
…, что превратит вашу команду в:
gnome-terminal -e "vim $1" "$2" "$3" ...
Возможно, это не то, что вы хотите, потому что -e takes only one argument. Используйте $1
, чтобы показать, что ваш сценарий может обрабатывать только один аргумент.
Очень сложно заставить несколько аргументов работать правильно в сценарии, который вы дали (с gnome-terminal -e
), потому что -e
принимает только один аргумент, который является командной строкой оболочки. Вам придется кодировать свои аргументы в один. Лучший и самый надежный, но довольно неуклюжий способ:
gnome-terminal -e "vim $(printf "%q " "$@")"
```.