
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.txt
wü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 /bin
sendet 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 /binn
wird 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 /bin
Anschließend wird der Befehl mit diesen Deskriptoranhängen ausgeführt . Da Sie stdout
zuerst zur Datei umleiten, stderr
erbt 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 stderr
zum ursprünglichen hergestellt stdout
, bei dem es sich wahrscheinlich um das Terminal handelt. Anschließend erfolgt eine Weiterleitung stdout
zu einer Datei. Dies hat keine Auswirkungen auf stderr
.