Captura de saída / redirecionamento de comandos encadeados por &&

10

Eu tenho uma série de comandos a, b, c qual estou encadeamento em conjunto com &&: a && b && c.

Eu quero pegar a saída de todos os comandos para stdout e stderr. a && b && c 2>&1 > capture_file captura apenas a saída do comando c.

TLOlczyk
fonte

Respostas:

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

Observe a ordem dos redirecionamentos: você deve redirecionar o stdout primeiro.

yaegashi
fonte
Por que stdout primeiro?
TLOlczyk
@TLOlczyk 2>&1significa duplicar o destino de stdout (1) para stderr (2), por isso seria inútil, a menos que você tenha configurado o redirecionamento stdout anteriormente.
Yaegashi
2
@TLOlczyk Não precisa ser stdout primeiro - você pode executar stderr primeiro: 2>capture_file >&2(mas não, porque isso não é idiomático). O importante é que você redirecione um deles para o arquivo antes de duplicar esse fluxo no outro.
perfil completo de Toby Speight
1

Além de usar o agrupamento de comandos, {}você também pode executar os comandos em um subshell e capturar a saída (e / ou erro) de uma só vez:

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

Exemplo:

$ ( 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
heemail
fonte