Прежде всего; как только вы начали процесс, вы можете запустить его в фоновом режиме, сначала остановив (нажав 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 &
), на самом деле вы ничего не можете сделать.
Я рекомендую вам получить screen
GNU. С помощью экрана вы можете просто закрыть работающую оболочку, когда вывод процесса становится надоедливым, и открыть новую (^Ac
).
Да, и, кстати, не используйте " $@
" там, где вы его используете.
$@
означает, $1
, $2
, $3
..., что превратит вашу команду в:
gnome-terminal -e "vim $1" "$2" "$3" ...
Это, вероятно, не то, что вы хотите, потому что -e принимает только один аргумент. Используйте $1
чтобы показать, что ваш скрипт может обрабатывать только один аргумент.
Действительно трудно получить несколько аргументов, работающих должным образом в сценарии, который вы задали (с помощью gnome-terminal -e
), потому что -e
принимает только один аргумент, который является командной строкой оболочки. Вы должны будете закодировать свои аргументы в один. Лучший и самый надежный, но довольно грубый способ выглядит так:
gnome-terminal -e "vim $(printf "%q " "$@")"