Po pierwsze; po rozpoczęciu procesu możesz go ustawić w tle, najpierw zatrzymując go (hit Ctrl- Z), a następnie pisząc, bg
aby wznowić działanie w tle. Teraz jest to „zadanie”, a jego stdout
/ stderr
/ stdin
są nadal podłączone do twojego terminala.
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 &
Niektóre dodatkowe informacje:
nohup
to program, którego można użyć do uruchomienia aplikacji w taki sposób, że jego stdout / stderr może być zamiast tego wysłany do pliku i taki, że zamknięcie skryptu nadrzędnego nie ZWIĘKSZA dziecka. Jednak przed uruchomieniem aplikacji musisz mieć prognozę, aby z niej skorzystać. Ze względu na sposób nohup
działania nie można go po prostu zastosować do uruchomionego procesu .
disown
to wbudowane bash, które usuwa zadanie powłoki z listy zadań powłoki. Zasadniczo oznacza to, że nie możesz już na nim używać fg
, bg
ale co ważniejsze, gdy zamkniesz skorupę, nie będzie się ona zawieszać ani wysyłać SIGHUP
do tego dziecka. W przeciwieństwie do nohup
, disown
jest używany po uruchomieniu procesu i uruchomieniu go w tle.
To, czego nie możesz zrobić, to zmienić stdout / stderr / stdin procesu po jego uruchomieniu. Przynajmniej nie z muszli. Jeśli uruchomisz proces i powiesz mu, że jego stdout jest terminalem (co robisz domyślnie), wówczas proces ten jest skonfigurowany tak, aby wyświetlał dane w terminalu. Twoja powłoka nie ma nic wspólnego z konfiguracją FD procesów, jest to po prostu coś, czym sam proces zarządza. Sam proces może zdecydować, czy zamknąć stdout / stderr / stdin, czy nie, ale nie możesz użyć powłoki, aby to zmusić.
Aby zarządzać danymi wyjściowymi procesu w tle, masz wiele opcji ze skryptów, prawdopodobnie „nohup” jako pierwszy. Ale dla interaktywnych procesów zaczynasz, ale zapomniałeś uciszyć ( firefox < /dev/null &>/dev/null &
), tak naprawdę niewiele możesz zrobić.
Polecam dostać GNU screen
. Za pomocą screena możesz po prostu zamknąć działającą powłokę, gdy wynik procesu staje się kłopotliwy i otworzyć nową ( ^Ac
).
Aha, a przy okazji, nie używaj „ $@
” tam, gdzie go używasz.
$@
oznacza $1
, $2
, $3
..., które mogłyby włączyć polecenie na:
gnome-terminal -e "vim $1" "$2" "$3" ...
Prawdopodobnie nie tego chcesz, ponieważ -e bierze tylko jeden argument. Użyj, $1
aby pokazać, że twój skrypt może obsłużyć tylko jeden argument.
Naprawdę trudno jest uzyskać prawidłowe działanie wielu argumentów w scenariuszu, który podałeś (wraz z gnome-terminal -e
), ponieważ -e
bierze tylko jeden argument, który jest ciągiem poleceń powłoki. Musisz zakodować swoje argumenty w jeden. Najlepszy i najbardziej niezawodny, ale raczej niezbyt gęsty sposób:
gnome-terminal -e "vim $(printf "%q " "$@")"