Прежде всего; как только вы запустили процесс, вы можете запустить его в фоновом режиме, сначала остановив (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 " "$@")"