Antworten:
Der nachfolgende &
Operator am Ende eines Befehls wird verwendet, um Befehle in den Hintergrund zu stellen. Dies ist tatsächlich eine vom POSIX-Standard festgelegte Standardsyntax :
Asynchrone Listen
Wenn ein Befehl vom Steueroperator ('&') beendet wird, muss die Shell den Befehl asynchron in einer Subshell ausführen. Dies bedeutet, dass die Shell nicht warten soll, bis der Befehl beendet ist, bevor der nächste Befehl ausgeführt wird.
Das Format zum Ausführen eines Befehls im Hintergrund lautet:
Befehl1 & [Befehl2 & ...]
Der Zweck des Hintergrunds von Befehlen besteht darin, einen Befehl auszuführen, ohne dass die Haupt-Shell im Skript oder in der interaktiven Shell auf den Befehl wartet. Dies würde die Ausführung anderer Befehle blockieren und dem Benutzer das Warten erschweren. Dies ist praktisch, um lang laufende Befehle zu starten, aber Sie müssen die Arbeit in der aktuellen Shell fortsetzen. Wie Sie sich vorstellen können, entstand dies aus der Zeit, als es keine Terminalemulatoren mit mehreren Registerkarten gab, aber Terminals tatsächliche physische Hardware waren, die an einen Computer selbst angeschlossen war.
Aus der Definition geht hervor, dass &
sie ähnlich wie ;
dies auch als Befehlsabschluss für Befehlslisten dient . In Ihrem speziellen Beispiel pyprogramm >> /dev/null 2>&1 &
gibt es nur einen Befehl in der Liste.
Allgemeiner,
echo Hello ; echo World ;
und
echo Hello & echo World &
sind zwei Beispiele für Listen, die von den Operatoren ;
und beendet &
werden. Ein Unterschied besteht darin, dass an die &
abgeschlossene Liste ein Eingang angeschlossen ist, /dev/null
wenn die Jobsteuerung deaktiviert ist:
Wenn die Jobsteuerung deaktiviert ist (siehe set, -m), wird davon ausgegangen, dass die Standardeingabe für eine asynchrone Liste, bevor explizite Umleitungen durchgeführt werden, einer Datei zugewiesen wird, die dieselben Eigenschaften wie / dev / null aufweist. Dies darf nicht geschehen, wenn die Jobsteuerung aktiviert ist. In allen Fällen hat die explizite Umleitung der Standardeingabe Vorrang vor dieser Aktivität.
In der sequentiellen Liste hat jedoch jeder Befehl immer noch eine stdin
Verbindung zum Terminal, wenn keine expliziten Umleitungen vorhanden sind.
Beachten Sie auch, dass nach der zuvor erwähnten Definition &
Befehle in der Subshell ausgeführt werden. Im Gegensatz dazu wird die ;
abgeschlossene Liste in der aktuellen Shell ausgeführt. Es gibt auch Unterschiede in den Exit-Status. Für &
den Standard heißt es:
Der Exit-Status einer asynchronen Liste muss Null sein.
Dies ist wichtig, wenn Sie mehrere Befehle in den Hintergrund stellen möchten. Wenn Sie ein Skript oder einen Befehl schreiben, müssen Sie Befehle auswählen, für die es Ihnen egal ist, ob sie fehlgeschlagen sind oder nicht, oder Sie müssen einen Weg finden, um den Exit-Status ungleich Null (Fehler) zu behandeln. In Ihrem speziellen Beispiel sollte das pyprogramm >> /dev/null 2>&1 &
Ausführen im Hintergrund eine Möglichkeit haben, anzuzeigen, ob es fehlgeschlagen ist oder nicht. Wenn Sie jedoch davon ausgehen, dass Sie es verwenden 2>&1
, verbergen Sie die Fehlerausgabe durch Umleiten, und Sie gehen wahrscheinlich davon aus, dass das Skript nicht fehlschlagen sollte.
Im Gegensatz dazu ist der ;
Exit-Status definiert als:
Der Beendigungsstatus einer sequentiellen Liste ist der Beendigungsstatus des letzten Befehls in der Liste.
Dies hat wiederum Auswirkungen darauf, wie Sie eine sequentielle Liste von Befehlen in die Befehlszeile schreiben und wie die Dinge behandelt werden sollen, wenn einige der Befehle in der Liste fehlschlagen.
Die Tatsache , dass dies POSIX Definition bedeutet , dass alle Bourne-wie Muscheln, Bedeutung bash
, dash
und ksh
sie unterstützen müssen.
&
in der Umleitung unterscheidet sich von &
als Befehlsterminator. Dies bedeutet, dass das Dateideskriptorobjekt dupliziert (kopiert) wird. Siehe Was bedeutet & genau in der Ausgabeumleitung?
In bash
gibt es auch |&
Operator (beachten Sie keinen Abstand zwischen Rohr und kaufmännischem Und). Aus dem Bash-Handbuch :
Wenn | & verwendet wird, wird der Standardfehler des Befehls zusätzlich zu seiner Standardausgabe über die Pipe mit der Standardeingabe von Befehl2 verbunden. es ist eine Abkürzung für 2> & 1 |. Diese implizite Umleitung des Standardfehlers zur Standardausgabe erfolgt nach allen durch den Befehl angegebenen Umleitungen.
Dies bedeutet, dass der Befehl im Hintergrund ausgeführt wird. Das aufrufende Skript wird fortgesetzt, anstatt zu blockieren, bis der aufgerufene Befehl abgeschlossen ist.
&
Ausblenden der Ausgabe sagen, klingt nicht richtig. Der Absatz aus dem Standard, den Sie zitieren, spricht von Eingabe , nicht von Ausgabe . Der Grund für die Unterscheidung zwischen aktivierter oder nicht aktivierter Jobsteuerung besteht darin, dass ein Hintergrundprozess, der versucht, aus dem tty zu lesen, angehalten wird. An diesem Punkt müssen Sie die Jobsteuerung verwenden, um sie in den Vordergrund zu stellen und die Eingabe bereitzustellen, auf die sie wartet. All dies ist ohne Jobsteuerung nicht möglich. Wenn die Jobsteuerung deaktiviert ist, muss der Standard von/dev/null
oder gleichwertig umgeleitet werden .