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 " "$@")"