Gemäß " Linux: The Complete Reference 6th Edition " (S. 44) können Sie mit den Umleitungssymbolen nur STDERR |&
umleiten.
Ich habe ein ziemlich einfaches Skript geschrieben, um dies zu testen:
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
Ich führe dieses Skript folgendermaßen aus:
./script.sh |& sed 's:^:\t:'
Vermutlich werden nur die in STDERR gedruckten Zeilen eingerückt. Allerdings funktioniert es nicht wirklich so, wie ich sehe:
Normal Text.
Error Text.
Was mache ich hier falsch?
quelle
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
nicht wie vorgesehen funktioniert, dh: redirectscript.sh
'sstdout
(was laut manuellem Snippet zuerst passieren sollte), dann erlaubengrep
, die Skripte zu verarbeitenstderr
. Stattdessenstderr
und tdout` landen beidestdout_goes_here
|&
ist kurzsichtig für2>&1 |
. So>/tmp/stdout_goes_here |&
Umleitungen an stdout/tmp/stdout_goes_here
, dann2>&1
leitet stderr an , wohin stdout geht ist, was ist/tmp/stdout_goes_here
, und schließlich|
erhält keine Eingabe , da die Ausgabe des Befehls umgeleitet wurde. Denken Sie daran, dass die>&1
Weiterleitung an den Speicherort von Dateideskriptor 1 erfolgt und nicht an den Speicherort von Dateideskriptor 1 . Eine Möglichkeit ist, nur stderr zu leiten und stdout in eine Datei umzuleiten2>&1 >/tmp/stdout_goes_here |
.|&
Pipes stderr nach stdin,2>&1 |
also wird das nächste Programm beide auf stdin bekommen.quelle
runcommand 2>&1 | tee
? dhruncommand |& tee
?|&
in bash ist nur eine (nicht fürchterlich tragbare) Abkürzung für2>&1 |
, daher sollte jede Zeile eingerückt sein.quelle