En ce qui concerne le shell bash, je trouve que la meilleure façon de se souvenir est de comprendre ce qui se passe.
Si tout ce que vous voulez faire est de vous rappeler comment obtenir la commande correcte, vous pouvez essayer
program > /results 2> /results
C'est beau et évident ce qui se passe et facile à retenir. c'est à dire
1
STDOUT va /results
2
STDERR se rend également directement à/results
le problème est que cela ne fonctionne pas comme prévu. considérer ce qui suit:
fichier: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
et exécutez la commande
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
puis
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
que s'est-il passé ici?
Je crois comprendre que bash configure la redirection pointant le STDERR directement vers le fichier /tmp/results
et en raison de la nature de >
ce qui fait 2 choses
- normalement créer un nouveau fichier - dans ce cas, l'opportunité est passée, bash dépassant cette routine au moment de la génération de la sortie.
- insérer directement au début du fichier. et ne pas ajouter comme
>>
fait.
Donc, dans ce cas, STDERR, insère directement au début du /tmp/results
remplacement de la sortie de STDOUT.
Remarque: si vous aviez l'habitude >>
d'ajouter, vous pourriez probablement vous en tirer avec cette syntaxe.
Cependant, pour résoudre le problème dont vous avez besoin - non pas pour rediriger STDERR - directement vers le fichier, mais plutôt pour fusionner la sortie de STDERR dans le flux STDOUT, afin d'éviter toute collision.
En utilisant l'opérateur, l' 2>&1
opérateur réalise ceci
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
Le &
permet bash de distinguer d'un fichier nommé 1
et le 1
descripteur de fichier.
Pour moi, la déclaration 2>&1
elle-même explique exactement ce qui se passe - STDERR est redirigé vers STDOUT lui-même - et ne se termine que /tmp/results
parce que c'est là que STDOUT est pointé (presque comme un effet secondaire).
Contrairement à ce que beaucoup de guides affirment, c’est-à-dire que 2>&1
STDERR est envoyé partout où STDOUT est pointé. Si cela était vrai, vous auriez toujours le problème de réécriture.
Pour plus d'informations, voir http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Il arrive parfois que vous ayez besoin de mélanger les élémentsstdout
etstderr
ensemble pour voir ce qui se passe réellement - par exemple, la sortie d’un processus de compilation complexe redirigé vers un fichier. Dans ce cas, je