Capture de sortie / redirection de commandes chaînées par &&

10

Je une série de commandes a, b, c que je chaînage avec &&: a && b && c.

Je veux attraper la sortie de toutes les commandes à la fois sur stdout et stderr. a && b && c 2>&1 > capture_file capture uniquement la sortie de la commande c.

TLOlczyk
la source

Réponses:

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

Notez l'ordre des redirections: vous devez d'abord rediriger stdout.

yaegashi
la source
Pourquoi stdout en premier?
TLOlczyk
@TLOlczyk 2>&1signifie dupliquer la destination de stdout (1) vers stderr (2), donc ce serait inutile à moins que vous n'ayez préalablement configuré la redirection stdout.
yaegashi
2
@TLOlczyk Il n'est pas nécessaire que ce soit stdout en premier - vous pouvez d'abord faire stderr: 2>capture_file >&2(mais pas, car ce n'est pas idiomatique). L'important est que vous redirigiez l'un d'entre eux vers un fichier avant de dupliquer ce flux vers l'autre.
Toby Speight
1

Outre l'utilisation du regroupement de commandes, {}vous pouvez également exécuter les commandes dans un sous-shell et capturer la sortie (et / ou l'erreur) à la fois:

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

Exemple :

$ ( 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
la source