Nehmen wir an, ich führe einen Befehl oder ein Shell-Skript aus und bekomme eine Ausgabe. Wie kann man feststellen, ob die Ausgabe von stderr
oder stammt, ohne die Interna dieses Befehls oder Shell-Skripts zu kennen stdout
?
Zum Beispiel
$ ls -ld /
drwxrwxr-t 35 root admin 1258 Dec 11 19:16 /
vs
ls -ld /test
ls: /test: No such file or directory
Wie stelle ich sicher, dass der erste Befehl an stdout
und der zweite an stderr
(hat es funktioniert?) Gedruckt wurde ?
io-redirection
KM.
quelle
quelle
stderred
in Ihrer Shell-UmgebungLD_PRELOAD
zu bekommenstdout
undstderr
in verschiedenen Farben. Hier ist eine verwandte Frage in diesem Sinne.Antworten:
Es ist nicht zu erkennen, ob die Ausgabe bereits gedruckt wurde. In diesem Fall sind beide
stdout
undstderr
mit dem Terminal verbunden, sodass die Informationen darüber, in welchen Stream geschrieben wurde, bereits verloren waren, als der Text auf Ihrem Terminal angezeigt wurde. Sie wurden vom Programm kombiniert, bevor sie das Terminal erreichten.In einem Fall wie dem oben beschriebenen können Sie den Befehl mit ausführen
stdout
undstderr
an verschiedene Stellen umleiten, um zu sehen, was passiert. Oder führen Sie es zweimal aus, einmal mitstdout
Weiterleitung zu/dev/null
und einmal mitstderr
Weiterleitung zu/dev/null
, und überprüfen Sie, in welchem dieser Fälle der Text angezeigt wird.Sie können zu umleiten
stdout
,/dev/null
indem Sie>/dev/null
am Ende der Befehlszeile anheften , und Sie können zu umleitenstderr
,/dev/null
indem Sie hinzufügen2>/dev/null
.quelle
Sie können stdout mit
> file
und stderr mit umleiten2> file
. Viele moderne Shells unterstützen die Umleitung zu Befehlen, sodass Siesed
hervorheben können, welche Ausgabe von welchem Stream stammt:quelle
(echo "this is stdout"; echo "this is stderr" >&2) > >(sed 's/.*/\x1b[32m&\x1b[0m/') 2> >(sed 's/.*/\x1b[31m&\x1b[0m/')
Mit dem
annotate-output
Skript von Debiandevscripts
können Sie dies selektiv tun:Die zweite Spalte zeigt stdout und stderr mit
O
undE
an.Es gibt einige Vorbehalte, von denen der Haupt wie in den anderen Antworten angegeben ist: Sie können dies nicht nachträglich tun. Weder der Shell noch dem Terminal ist bekannt, wie ein beliebiges Programm seine Dateideskriptoren verwendet, obwohl die Shell für die anfängliche Einrichtung verantwortlich ist.
Bei dieser Methode werden Fifos verwendet. Das Schreiben in ein Fifo kann sich anders verhalten als das Schreiben in ein Tty. Das Schreiben in zwei verschiedene Fifos ist definitiv unterschiedlich (potenzielle Timing- / Interleaving-Probleme). Es ist auch nicht für den interaktiven Gebrauch geeignet, zB
annotate-output bash
ist es kein großartiger Plan, aber für viele andere Zwecke nützlich. Es gibt viele, viele Beispiele für Skripte und Shell-Funktionen, die Antworten auf verwandte Fragen zum Kolorieren von stdin / stdout / stderr geben. Das robusteste ist stderrd, das die Laufzeitmodifikation von (den meisten) Programmen verwendet, um in stderr geschriebene Daten zu ändern.Diese Frage, auf die Anko verweist, hat gute Antworten zu diesem verwandten Thema: Einfärben der Ausgabe von stdout / stderr: Kann ich meine Shell so konfigurieren, dass STDERR und STDOUT in verschiedenen Farben gedruckt werden?
quelle
bash
Skript handelt, daswhile read
Schleifen verwendet und einendate
Befehl für jede Zeile von stdout oder stderr ausführt. Daher ist es weitaus weniger effizient als dascmd > >(ts '%T O:') 2> >(ts '%T E:')
entsprechende Skript .Abgesehen von den anderen Antworten ist es interessant darauf hinzuweisen
/proc/$PID/fd
(obwohl es die Frage nicht beantwortet):Wie Sie sehen, sehen Sie hier die Dateideskriptoren, die für einen Prozess geöffnet wurden.
0
ist dasSTDIN
,1
ist dasSTDOUT
und2
ist dasSTDERR
. Wenn Sie STDOUT oder STDERR nicht umgeleitet hätten, würden Sie/dev/pts/33
(zumindest in diesem Beispiel) sehen, dass sie auf das Terminal verweisen würden.hinweise :
/proc/$PID
existiert nur für laufende prozesse. In diesem Fall habe ichcat
ohne Argumente verwendet, damit es nicht endet, bis ich das schließeSTDIN
. Ich habe es auch im Hintergrund ausgeführt, so dass ich die PID für dieses Beispiel sofort habe.quelle
Es ist nicht ganz klar, was Sie fragen, aber dies könnte helfen
Quelle
Wenn der Exit-Code 0 ist, bedeutet dies einfach, dass der Befehl korrekt ausgeführt wird (stdout). Hier finden Sie Bedeutungen, wenn der Exit-Code nicht 0 ist (stderr).
quelle
stdout
und Nicht-Nullstderr
?stderr
einen guten Fehlercode zu schreibenstdout
und diesen zurückzugeben , oder in einen schlechten Fehlercode zu schreiben und ihn zurückzugeben. Versuchenfind /root
Sie in der Tat - vorausgesetzt, Sie sind nicht als root angemeldet -, 2 Zeilen auszudrucken - "/ root" wird gedrucktstdout
und "find: / root: Berechtigung verweigert" wird gedrucktstderr
. Und find gibt einen falschen Rückkehrcode zurück.In der Regel wird STDERR der Nachricht der Programmname mit einem Doppelpunkt vorangestellt.
Beispiel:
Vs
quelle
So erfassen und testen Sie die Fehlerausgabe:
quelle