Erfassen der Ausgabe / Umleitung von Befehlen, die durch && verkettet sind

10

Ich habe eine Reihe von Befehlen a, b, c, die ich mit &&: verkette a && b && c.

Ich möchte die Ausgabe aller Befehle sowohl an stdout als auch an stderr abfangen. a && b && c 2>&1 > capture_file Erfasst nur die Ausgabe des Befehls c.

TLOlczyk
quelle

Antworten:

10
{ a && b && c; } >capture_file 2>&1

Beachten Sie die Reihenfolge der Umleitungen: Sie müssen zuerst stdout umleiten.

yaegashi
quelle
Warum zuerst stdout?
TLOlczyk
@TLOlczyk 2>&1bedeutet, das Ziel von stdout (1) nach stderr (2) zu duplizieren. Es wäre also nutzlos, wenn Sie nicht zuvor die stdout-Umleitung eingerichtet hätten.
Yaegashi
2
@TLOlczyk Es muss nicht haben zu stdout ersten sein - Sie stderr zuerst tun können: 2>capture_file >&2(aber nicht, denn das ist nicht idiomatischen ist). Wichtig ist, dass Sie einen von ihnen in eine Datei umleiten, bevor Sie diesen Stream in den anderen duplizieren.
Toby Speight
1

Neben der Verwendung der Befehlsgruppierung {}können Sie die Befehle auch in einer Subshell ausführen und die Ausgabe (und / oder den Fehler) sofort erfassen:

( a && b && c ) >file.txt 2>&1

Beispiel:

$ ( echo foo && echo bar && echo baz && echos foo ) >check 2>&1

$ cat check
foo
bar
baz
No command 'echos' found, did you mean:
 Command 'echo' from package 'coreutils' (main)
echos: command not found
heemayl
quelle