Umleiten von Standardausgabe und Standardfehler in eine Datei

Umleiten von Standardausgabe und Standardfehler in eine Datei

Ich habe verstanden, dass wir zwei Methoden haben, um sowohl stdout als auch stderr auf dieselbe Datei umzuleiten. Die erste Methode ist: ls -l /bin > ls-output.txt 2>&1 Als Autor vondieses BuchZustände: Mit dieser Methode führen wir zwei Umleitungen durch, zuerst leiten wir stdout zu ls-output.txt um und dann leiten wir stderr (Dateideskriptor 2) zu stdout (mit Dateideskriptor 1) um.

Die Reihenfolge der Weiterleitungen ist wichtig.

ls -l /bin 2>&1 >ls-output.txtwürde stderr auf den Bildschirm umleiten.

Meine Frage ist: Wurde der Befehl wie in vielen Programmiersprachen unter Berücksichtigung einiger Assoziativitäts- und Vorrangregeln entwickelt?Undwie lesen wir den Befehl, während wir ihn auf dem Bildschirm schreiben?UndWie ist die Reihenfolge der Backend-Ausführung des Befehls?

Folgendes denke ich über die Ausführungsreihenfolge: Zuerst ls -l /binsendet der Befehl seine Ausgabe an stdout und den Fehler an stderr (eines von beiden). Dann wird stderr an stdout umgeleitet (wenn ein Fehler auftritt, z. B.: if ls -l /binnwird verwendet). Jetzt enthält der stdout-Stream eines der beiden (entweder Ausgabe oder Fehler), das er dann an die Datei umleitet.ls-ausgabe.txt

Antwort1

Umleitungen werden von links nach rechts verarbeitet. Wenn Sie Folgendes ausführen:

ls -l /bin >ls-output.txt 2>&1

Die Shell führt intern ungefähr folgende Operationen aus:

fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);

ls -l /binAnschließend wird der Befehl mit diesen Deskriptoranhängen ausgeführt . Da Sie stdoutzuerst zur Datei umleiten, stderrerbt die Umleitung diese Umleitung.

Wenn Sie schreiben würden

ls -l /bin 2>&1 >ls-output.txt

Die Reihenfolge der Operationen wäre umgekehrt:

// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);

Dadurch wird eine Verbindung stderrzum ursprünglichen hergestellt stdout, bei dem es sich wahrscheinlich um das Terminal handelt. Anschließend erfolgt eine Weiterleitung stdoutzu einer Datei. Dies hat keine Auswirkungen auf stderr.

verwandte Informationen