Capturando salida / redirección de comandos encadenados por &&

10

Tengo una serie de comandos a, b, c, que estoy encadenando con &&: a && b && c.

Quiero capturar la salida de todos los comandos para stdout y stderr. a && b && c 2>&1 > capture_file solo captura la salida del comando c.

TLOlczyk
fuente

Respuestas:

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

Tenga en cuenta el orden de las redirecciones: primero debe redirigir stdout.

yaegashi
fuente
¿Por qué stdout primero?
TLOlczyk
@TLOlczyk 2>&1significa duplicar el destino de stdout (1) a stderr (2), por lo que sería inútil a menos que haya configurado la redirección de stdout de antemano.
yaegashi
2
@TLOlczyk No tiene que ser stdout primero, podrías hacer stderr primero: 2>capture_file >&2(pero no, porque eso no es idiomático). Lo importante es que redirija uno de ellos a un archivo antes de duplicar ese flujo al otro.
Toby Speight
1

Además de usar la agrupación de comandos {}, también puede ejecutar los comandos en una subshell y capturar la salida (y / o error) de una vez:

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

Ejemplo:

$ ( 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
fuente