Po pierwsze, po rozpoczęciu procesu, możesz go zatuszować, najpierw zatrzymując go (naciśnij Ctrl-Z), a następnie wpisując bg, aby pozwolić mu wznowić w tle. Teraz jest to “zadanie”, a jego stdout/stderr/stdin są nadal podłączone do Twojego terminalu.
Możesz natychmiast rozpocząć proces w tle, dodając na końcu “&”:
firefox &
Aby uruchomić go w tle wyciszonym, użyj tego:
firefox </dev/null &>/dev/null &
Kilka dodatkowych informacji:
nohup to program, którego możesz użyć do uruchomienia aplikacji z tak, aby jego stdout/stderr mógł być wysłany do pliku, a zamknięcie skryptu nadrzędnego nie wzruszyło dziecka. Musisz jednak mieć dalekowzroczność, aby z niego skorzystać, zanim uruchomisz aplikację. Ze względu na sposób działania nohup, nie można po prostu zastosować go do uruchomionego procesu.
disown jest wbudowanym bashem, który usuwa zadanie powłoki z listy zadań powłoki. W zasadzie oznacza to, że nie możesz już używać fg, bg na niej, ale co ważniejsze, gdy zamkniesz swoją powłokę, nie będzie ona już wisieć ani wysyłać SIGHUP do tego dziecka. W przeciwieństwie do nohup, disown jest używany poniżej proces został uruchomiony i osadzony w tle.
To czego _nie możesz zrobić, to zmienić stdout/stderr/stdin procesu po jego uruchomieniu. Przynajmniej nie z powłoki. Jeśli uruchomisz swój proces i powiesz mu, że jego stdout jest twoim terminalem (co domyślnie robisz), to proces ten jest skonfigurowany tak, by wyświetlać go na twoim terminalu. Twoja powłoka nie ma nic wspólnego z konfiguracją FD procesów, jest to wyłącznie coś, czym sam proces zarządza. Sam proces może zdecydować, czy zamknąć swój stdout/stderr/stdin czy nie, ale nie możesz użyć powłoki, aby go do tego zmusić.
Aby zarządzać wyjściem procesu w tle, masz wiele opcji ze skryptów, “nohup” jest prawdopodobnie pierwszym, który przychodzi na myśl. Ale dla interaktywnych procesów zaczynasz, ale zapomniałeś uciszyć (firefox < /dev/null &>/dev/null &), nie możesz zrobić wiele, naprawdę.
Polecam ci GNU screen. Z ekranem możesz po prostu zamknąć swoją działającą powłokę, gdy wyjście procesu stanie się kłopotem i otworzyć nową (^Ac).
Oh, a przy okazji, nie używaj “$@” tam, gdzie go używasz.
$@ oznacza, $1, $2, $3 …, co zamieniłoby twoją komendę w:
gnome-terminal -e "vim $1" "$2" "$3" ...
To chyba nie to, czego chcesz, bo -e tylko bierze jeden argument. Użyj $1, aby pokazać, że Twój skrypt może obsługiwać tylko jeden argument.
Naprawdę trudno jest uzyskać poprawne działanie wielu argumentów w podanym przez Ciebie scenariuszu (z gnome-terminal -e), ponieważ -e bierze tylko jeden argument, który jest łańcuchem poleceń powłoki. Musiałbyś zakodować swoje argumenty w jeden. Najlepszy i najbardziej solidny, ale raczej nieporęczny, sposób jest taki:
gnome-terminal -e "vim $(printf "%q " "$@")"