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