Antworten:
Das &
weist die Shell an, den Befehl im Hintergrund auszuführen, dh, er wird gegabelt und asynchron in einer separaten Sub-Shell als Job ausgeführt.
Beachten Sie, dass beim Einfügen &
der Ausgabe - sowohl stdout als auch stderr - weiterhin auf dem Bildschirm gedruckt wird . Wenn Sie keine Ausgabe auf dem Bildschirm sehen möchten, leiten Sie beide stdout
und stderr
in eine Datei um, indem Sie:
myscript > ~/myscript.log 2>&1 &
In der Regel möchten Sie die Datei möglicherweise verwerfen, stderr
indem Sie sie an weiterleiten, /dev/null
wenn Sie sich später keine Gedanken über die Fehleranalyse machen.
Sie können auch Befehle / Skripte gleichzeitig in separaten Unterschalen ausführen. Zum Beispiel;
./script1 & ./script2 & ./script3 &
Ein Hintergrundjob kann zur Befehlszeile zurückgebracht werden, bevor er mit dem Befehl beendet wird:
fg <job-number>
Die job-number
kann durch Laufen erhalten werden
jobs
2>&1
leitet weiter stderr
zu stdout
.
stty tostop
dass Hintergrundjobs angehalten werden, wenn sie versuchen, an das Terminal zu schreiben.
Wenn Sie verwenden &
, läuft der Prozess im Hintergrund. Die Standardausgabe ist aber immer noch das Terminal.
Tatsächlich können Sie ping 8.8.8.8 &
und find / -name '*test*' &
zur gleichen Zeit ausführen (was zu einer gemischten Ausgabe führt), jedoch möglicherweise nicht ping 8.8.8.8
und find / -name '*test*'
zur gleichen Zeit auf derselben Shell.
Wenn Sie nichts sehen möchten, verwenden Sie etwas wie ping 8.8.8.8 &> /dev/null &
.
Darüber hinaus möchten Sie vielleicht mehr über nohup
und erfahren disown
.
disown
verhindert nicht, dass die Ausgabe auf das Terminal gedruckt wird.
/dev/null
, dass eine Datei die Terminalausgabe umleiten soll, wenn die Ausgabe verworfen werden soll, anstatt sie irgendwo zu speichern. Und bin ich richtig , dass2>&1
Umleitungenstderr
zustdout
? Vielleicht möchten Sie das auch klären ... Danke.