Bash : redirection

Anne bash diff

Redirection des sorties avec tee

Lorsque l’on veut à la fois voir et mémoriser la sortie d’un programme, on utilise tee :

cmd | tee stdout.log

Si on veut aussi la sortie d’erreur :

cmd 2>&1 | tee std.log

Depuis bash 4, on peut aussi écrire :

cmd |& tee std.log

On peut aussi vouloir mémoriser les deux sorties dans deux fichiers différents (ici, on utilise le mécanisme de Process Substitution expliqué plus bas) :

cmd > >(tee stdout.log) 2> >(tee stderr.log >&2)

Tout cela est bien connu, mais il peut arriver que stdout ne s’affiche pas correctement à cause du fait que cette sortie est passe par un buffer. Pour contourner ce problème, il faut utiliser stdbuf : stdbuf -oL cmd 2>&1 | tee ../../tis/http2.log

Redirection de commandes

Je ne ne sais pas vraiment comment traduire Process Substitution mais ce qui est sûr, c’est que ça peut être très utile pour remplacer un pipe lorsqu’on ne veut pas créer un sous-processus. En effet, l’inconvénient de créer un sous-processus est que lorsqu’on en sort, on perd la valeur des variables que l’on a pu utiliser à l’intérieur.

Par exemple :

n=0
cat *.txt |
    while IFS= read -r line ; do
        n=$((n + 1))
    done
echo "Nombre de lignes : $n"

Ce script va toujours afficher 0 car la valeur de n est perdue quand on sort de la boucle (bien sur, cet exemple est un peu idiot : on utiliserait wc dans ce cas).

Une alternative est d'écrire:

n=0
while IFS= read line; do
  n=$((n + 1))
done < <(cat *.txt)

Cette syntaxe <(cmd) permet de créer une FIFO, et se comporte donc comme un fichier contenant la sortie de la commande.

Cette syntaxe peut également être pratique pour comparer la sortie de deux commande sans créer de fichiers intermédiaires :

diff <(sort list1) <(sort list2)

ou encore pour faire des recherches dans la sortie d’erreur:

commande > fichier.log 2> >( grep recherche >&2)

A l’inverse, on peut utiliser tee pour rediriger la sortie vers un script, tout en gardant l’affichage :

grep xyz *.txt | tee >(process_xyz)

Documentation

Voir aussi :