Bestimmen Sie, ob die Ausgabe stdout oder stderr ist

22

Wie kann ich feststellen, ob ein Prozess stdout oder stderr ausgibt?

Rauffle
quelle

Antworten:

22

Ich kenne nur drei Möglichkeiten, um zu bestimmen, was ein Programm an STDOUT und was an STDERR ausgibt

  1. Lesen Sie die Dokumentation. Oder

  2. Experimentieren Sie mit der Umleitung †

  3. drucke STDERR in rot

†Beispielsweise:

program > program.stdout 2> program.stderr

Schauen Sie sich dann die beiden Ausgabedateien an, um zu sehen, was das Programm in STDOUT und was in STDERR geschrieben hat.

Anstelle der Umleitung können Sie eine Pipe-Funktion verwenden, um teedie Ausgabe auf dem Bildschirm und in einer Datei fortzusetzen. Siehe /programming//q/692000/477035

RedGrittyBrick
quelle
15
Normalerweise verwende ich eine Variante von Option 3: program | grep .STDOUT wird rot gedruckt.
Dennis
Rot zu drucken ist genau das, wonach ich gesucht habe. Thanks RedGrittyBrick & Dennis
Rauffle
7

Basierend auf Ihrer kommentierten Anfrage:

{ { command; } 2>&3 | sed 's/^/STDOUT: /'; } 3>&1 1>&2 | sed 's/^/STDERR: /'
zebediah49
quelle
3
Sieht beeindruckend aus. Aber hätten Sie etwas dagegen, die Kirschen zu Ihrem Baum hinzuzufügen und zu erklären, was er tut? Nicht jeder hier ist ein Guru - und dein Konstrukt ist ziemlich komplex;)
Izzy
Die Klammern dienen zur Bestellung. Ich habe tatsächlich genau diese Form von I-forget-where erhalten, aber es geht darum, zusätzliche Dateideskriptoren (jenseits von 1 = stdoutund 2 = stderr) zu verwenden, um die Ausgabe des inneren Satzes von Klammern zu übernehmen und stdouteinen sedBefehl auszuführen , während er stderrdurchläuft eine andere.
Zebediah49
Wow. Wusste nicht, diese zusätzlichen Deskriptoren zu verwenden. Zuerst war ich ein bisschen verwirrt (ich verstehe gerne, was ich laufe - und bin ein bisschen verwirrt mit den geschweiften Klammern). Aber jetzt ist es klar - und meiner Meinung nach genau das, was der OP wollte. Also +1 von mir :)
Izzy
Das hat mir geholfen. Ich wollte mehr Daten in stderr hinzufügen. Dies erledigt das und gibt alles korrekt auf stdout / stderr aus. { { { { echo "stdout" ; echo "stderr">&2; } 2>&3; } 3>&1 1>&2 | awk '{print "ERROR:",$0}' 1>&3; } 3>&2 2>&1; }
Bryan Drewery
0

Sie können stderr einfach in eine Datei umleiten, und wenn etwas darin auftaucht, ist es von stderr.

z.B ls -a 2> ls-all.txt

Wenn aus irgendeinem Grund ein Fehler an stderr gesendet wurde, wird er in diese Datei umgeleitet.

magna_nz
quelle
-1

Wenn Sie dies einmal tun möchten, leiten Sie einen von ihnen an eine andere Stelle um.

B. Umleitung Standard raus mit >.

ls -al> ls-l.txt (jede Ausgabe hier ist nicht von stdout, wenn Sie etwas sehen, muss es eine stderr-Ausgabe sein)

Für die stderr Umleitung verwenden 2>

Hennes
quelle
Der Prozess erzeugt einen konstanten Strom von Ausgaben, von denen einige stdout und andere stderr sind. Ich möchte bestimmen, welche welche ist, da diese Ausgabe auf den Bildschirm geht
Rauffle