Ich habe ein Bash-Skript gesehen, das den exec 1>&2
-Befehl in einer Funktion hatte. Etwas wie:
Wie ich verstanden habe, bedeutet exec 1>&2
, dass alles von diesem Punkt an zu stderr geleitet wird. Ist das ein festes Verhalten von exec , das man auswendig wissen muss oder gibt es dafür eine gute Erklärung? Ich verstehe, dass exec im Bash-Skript nur einen Befehl aufruft, der die gleiche PID hat wie das Bash-Skript und sobald der Befehl abgeschlossen ist , die PID wird getötet. 1 & gt; & amp; 2 ist kein Befehl. Könnte jemand die Details (insbesondere die Frage why ) hinter dem Befehl exec 1>&2
erklären?
exec
ist eine integrierte Bash-Funktion, daher kann es ein spezielles Verhalten haben, das ein externes Programm nicht haben könnte. Insbesondere hat es das spezielle Verhalten:
Wenn COMMAND nicht angegeben ist, werden alle Umleitungen in der aktuellen Shell wirksam.
(Das zitiert aus der Nachricht von help exec
.)
Dies gilt für jede Art von Umleitung. Sie können zum Beispiel auch eine dieser Zeilen schreiben:
%Vor%(Es gilt jedoch nicht für Pipes.)
Das Warum ist ein Zufall der Geschichte, es gibt keinen guten Grund dafür.
Die Umleitungsoperatoren werden auf jedes Programm angewendet (z. B. cat
), und das Formular >&
wurde hinzugefügt, um den "doppelten Dateideskriptor 1 von 2" auszudrücken, weil es nützlich war. Die >&
-Syntax wurde wahrscheinlich verwendet, weil sie keine Sonderzeichen mehr enthielten und >&
war Unsinn angesichts der grundlegenden Bedeutung von &
und >
(aber zitiere mich nicht). Dieses Zeug stammt aus der frühen Bourne-Shell um 1977.
Warum exec
plus eine Umleitung zum Ändern der Eingabe und Ausgabe der aktuellen Shell? Wahrscheinlich, weil es bereits eine Bedeutung für den Nullbefehl > path
gab, die den gleichen Effekt wie cat /dev/null > path
hatte, aber einfacher zu tippen war, und wenn Ihr Fernschreiber bestenfalls mit 10 Zeichen pro Sekunde lief, war das wichtig. Also wurde das eingebaute exec
dann überladen: ohne Argumente hat es die Umleitungsoperationen auf sich selbst angewendet.
Da bash versucht, so gut wie möglich an Bourne-Shell-Konvention zu halten, bekommt man diese Antiquitäten, an die man sich erinnern muss, besonders wenn man versucht, andere Mitglieder des entsprechenden Geschlechts zu beeindrucken (zB "chicks dig ein Typ, der seine E / A-Umleitung arcana kennt ").
Ursprüngliche Quelle: Ссылка
Der Befehl exec & lt; filename leitet stdin in eine Datei um. Von diesem Zeitpunkt an stammen alle stdin aus dieser Datei und nicht aus der normalen Quelle (normalerweise Tastatureingabe). Dies bietet eine Methode zum Lesen einer Datei Zeile für Zeile und möglicherweise Parsing jede Zeile der Eingabe mit sed und / oder awk.
Ähnlich leitet ein Befehl exec & gt; Dateiname stdout in eine bestimmte Datei um. Dies sendet alle Befehlsausgaben, die normalerweise zu dieser Datei in stdout gehen würden.
Beachten Sie, dass Exec N & gt; Dateiname wirkt sich auf das gesamte Skript oder die aktuelle Shell aus. Die Umleitung in der PID des Skripts oder der Shell von diesem Zeitpunkt an hat sich geändert. N & gt; Dateiname wirkt sich nur auf den neu verzweigten Prozess aus, nicht auf das gesamte Skript oder die gesamte Shell.
Weitere Informationen, die Sie interessieren, finden Sie unter Ссылка . Es gibt viele nette kleine Umleitungstricks, die Sie tun können.