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