Catturare output / reindirizzamento di comandi concatenati da &&


11

Ho una serie di comandi a, b, c che sto concatenazione con &&: a && b && c.

Voglio catturare l'output di tutti i comandi sia su stdout che su stderr. a && b && c 2>&1 > capture_file acquisisce solo l'output dal comando c.

Risposte:


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

Nota l'ordine dei reindirizzamenti: devi prima reindirizzare stdout.


Perché prima stdout?
TLOlczyk,

@TLOlczyk 2>&1significa duplicare la destinazione di stdout (1) su stderr (2), quindi sarebbe inutile se non avessi impostato il reindirizzamento stdout in anticipo.
Yaegashi,

2
@TLOlczyk Non deve essere prima stdout - potresti prima fare stderr: 2>capture_file >&2(ma non farlo, perché non è idiomatico). L'importante è che reindirizzi uno di essi al file prima di duplicare quel flusso sull'altro.
Toby Speight,

1

Oltre a utilizzare il raggruppamento dei comandi, {}è anche possibile eseguire i comandi in una subshell e acquisire l'output (e / o l'errore) contemporaneamente:

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

Esempio :

$ ( 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.