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 :
- Afficher un pourcentage dans une page HTML
- VNC : Virtual Network Computing
- Git : déménagement d'un dépôt
- Quelques liens au sujet de l'analyse statique
- Ocaml: mon principal langage de développement
- Disque dur externe
- Les profiles dans Firefox
- Cryptographie et mail sous Android
- Quelques liens au sujet du C
- Git rebase : pour diviser un commit