Wie leite ich stderr und stdout zu verschiedenen Dateien in derselben Zeile im Skript um?


179

Ich weiß so viel:

$ command 2>> error

$ command 1>> output

Gibt es eine Möglichkeit, den stderr in die Fehlerdatei und den stdout in die Ausgabedatei in derselben Bash-Zeile auszugeben?

Antworten:


292

Fügen Sie sie einfach in einer Zeile hinzu command 2>> error 1>> output

Beachten Sie jedoch, dass dies >>zum Anhängen dient, wenn die Datei bereits Daten enthält. Während, >werden alle vorhandenen Daten in der Datei überschreiben.

Also, command 2> error 1> outputwenn Sie nicht anhängen möchten.

Nur zur Vervollständigung können Sie so schreiben, 1>als ob >der Standard-Dateideskriptor die Ausgabe ist. so 1>und >ist das gleiche.

So command 2> error 1> outputwird,command 2> error > output


3
Gute Antwort! Ich mag Ihre Erklärung, wie 1>geschrieben werden kann als>
user784637

Wie unterscheidet sich das von wie command &2>err.log, ich denke, ich bin total verwirrend Sintaxien. (Ein Link zu einer angemessenen Antwort aller Bash-Pipe-Ismen könnte in Ordnung sein)
ThorSummoner

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html ist genau das, wonach Sie suchen. Fwiw, sieht so aus, als wäre command &2>err.loges nicht ganz legitim - das kaufmännische Und in dieser Syntax wird für den Dateideskriptor als Ziel verwendet, z. B. command 1>&2würde stdout zu stderr umgeleitet.
DreadPirateShawn

@DreadPirateShawn, bitte verknüpfen Sie das ABS nicht als Referenz - es enthält gelegentlich völlige Ungenauigkeiten und sehr häufig Beispiele für schlechte Praktiken. wiki.bash-hackers.org/howto/redirection_tutorial ist eine weitaus bessere Referenzquelle für die Umleitung.
Charles Duffy

27

Versuche dies:

your_command 2>stderr.log 1>stdout.log

Mehr Informationen

Die Ziffern 0durch 9sind Dateideskriptoren in Bash. 0steht für Standardeingabe, 1steht für Standardausgabe, 2steht für Standardfehler. 3bis 9sind für jede andere vorübergehende Verwendung frei.

Jeder Dateideskriptor kann mithilfe des Operators in eine Datei oder in einen anderen Dateideskriptor umgeleitet werden >. Sie können stattdessen den Operator verwenden >>, um an eine Datei anzuhängen, anstatt eine leere zu erstellen.

Verwendung:

file_descriptor > filename

file_descriptor > &file_descriptor

Weitere Informationen finden Sie im Advanced Bash-Scripting-Handbuch: Kapitel 20. E / A-Umleitung .


Thanks.i sucht dies für eine Stunde
dılo sürücü


9

Oder wenn Sie Ausgaben (stdout & stderr) in einer einzigen Datei mischen möchten, möchten Sie möglicherweise Folgendes verwenden:

command > merged-output.txt 2>&1

32
Dies ist keine Antwort auf die Frage.
Matthias

Warum führen Leute Outputs zusammen oder schlagen vor, Outputs zusammenzuführen?
Nurettin

@nurettin: Vielleicht haben Sie eine Skriptzeile, die nur einen Befehl ausführt und die Ausgabe sofort in einer Protokolldatei speichert. Der betreffende Befehl kann manchmal fehlschlagen, daher möchten Sie auch diesbezügliche Fehler in derselben Protokolldatei speichern.
Streamofstars

@streamofstars ja natürlich hast du recht, vielleicht ist es manchmal das, was die Leute wollen. Ich habe im Kontext dieser Frage als jemand kommentiert, der nach Antworten suchte und viele irrelevante Antworten im gesamten Stackoverflow fand.
Nurettin

0

Die Ausgabe mehrerer Befehle kann umgeleitet werden. Dies funktioniert entweder für die Befehlszeile oder am nützlichsten in einem Bash-Skript. Das -sleitet die Passwortabfrage auf den Bildschirm.

Hereblock cmds stdout / stderr werden an separate Dateien gesendet und nichts angezeigt.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Hereblock cmds stdout / stderr werden an eine einzelne Datei gesendet und angezeigt.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Hereblock cmds stdout / stderr werden an separate Dateien gesendet und stdout zur Anzeige.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Abhängig davon, wer Sie sind (whoami) und Benutzername, kann ein Passwort erforderlich sein oder nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.