Als erstes; Sobald Sie einen Prozess gestartet haben, können Sie ihn im Hintergrund anzeigen, indem Sie ihn zuerst anhalten (drücken Sie Ctrl- Z) und dann eingeben bg
, damit er im Hintergrund fortgesetzt wird. Es ist jetzt ein "Job", und seine stdout
/ stderr
/ stdin
sind immer noch mit Ihrem Terminal verbunden.
Sie können einen Prozess im Hintergrund sofort starten, indem Sie ein "&" an dessen Ende anhängen:
firefox &
Verwenden Sie diese Option, um es im Hintergrund stumm zu schalten:
firefox </dev/null &>/dev/null &
Einige zusätzliche Informationen:
nohup
ist ein Programm, mit dem Sie Ihre Anwendung so ausführen können, dass stattdessen stdout / stderr an eine Datei gesendet werden kann und das Schließen des übergeordneten Skripts das untergeordnete Skript nicht SEHT. Sie müssen jedoch die Voraussicht gehabt haben, um es zu verwenden, bevor Sie die Anwendung gestartet haben. Aufgrund der Funktionsweise nohup
können Sie es nicht einfach auf einen laufenden Prozess anwenden .
disown
ist eine integrierte Bash, die einen Shell-Job aus der Job-Liste der Shell entfernt. Was dies bedeutet im Grunde , dass Sie nicht verwenden können fg
, bg
auf es mehr, aber noch wichtiger ist , wenn Sie Ihre Shell schließen wird es nicht hängen oder senden SIGHUP
mehr an das Kind. Im Gegensatz zu nohup
, disown
verwendet wird , nachdem der Prozess gestartet und hintergründig ist.
Was Sie nicht tun können, ist die stdout / stderr / stdin eines Prozesses zu ändern, nachdem Sie ihn gestartet haben. Zumindest nicht aus der Schale. Wenn Sie Ihren Prozess starten und ihm mitteilen, dass seine Standardausgabe Ihr Terminal ist (was Sie standardmäßig tun), ist dieser Prozess für die Ausgabe auf Ihrem Terminal konfiguriert. Ihre Shell hat nichts mit dem FD-Setup der Prozesse zu tun, das ist nur etwas, was der Prozess selbst verwaltet. Der Prozess selbst kann entscheiden, ob stdout / stderr / stdin geschlossen werden soll oder nicht, aber Sie können Ihre Shell nicht verwenden, um dies zu erzwingen.
Um die Ausgabe eines Hintergrundprozesses zu verwalten, stehen zahlreiche Optionen aus Skripten zur Verfügung, wobei "nohup" wahrscheinlich die ersten sind, die in den Sinn kommen. Aber für interaktive Prozesse, die Sie starten, aber vergessen haben, ( firefox < /dev/null &>/dev/null &
) zum Schweigen zu bringen , können Sie nicht wirklich viel tun.
Ich empfehle dir GNU screen
. Mit screen können Sie einfach Ihre laufende Shell schließen, wenn die Ausgabe des Prozesses störend wird, und eine neue öffnen ( ^Ac
).
Oh, und übrigens, benutzen Sie " $@
" nicht dort, wo Sie es benutzen.
$@
bedeutet, $1
, $2
, $3
..., die Ihren Befehl in drehen würden:
gnome-terminal -e "vim $1" "$2" "$3" ...
Das ist wahrscheinlich nicht das, was Sie wollen, weil -e nur ein Argument nimmt. $1
Zeigen Sie mit, dass Ihr Skript nur ein Argument verarbeiten kann.
Es ist wirklich schwierig, mehrere Argumente in dem von Ihnen angegebenen Szenario (mit dem gnome-terminal -e
) zum Funktionieren zu bringen, da -e
nur ein Argument benötigt wird, nämlich eine Shell-Befehlszeichenfolge. Sie müssten Ihre Argumente zu einem zusammenfassen. Der beste und robusteste, aber ziemlich klobige Weg sieht so aus:
gnome-terminal -e "vim $(printf "%q " "$@")"