Comme les autres l'ont dit, Linux fournit deux flux de sortie différents:
stdout , ou "sortie standard", est l'endroit où toutes les sorties normales vont.
Vous pouvez le référencer en utilisant un descripteur de fichier 1
.
stderr , ou "erreur standard" est un flux distinct pour les informations hors bande.
Vous pouvez le référencer en utilisant un descripteur de fichier 2
.
Pourquoi deux flux de sortie différents? Considérons un pipeline de commandes imaginaires:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Imaginez maintenant que la decrypt
commande échoue et génère un message d'erreur. S'il envoyait ce message à stdout
, il serait envoyé dans le tuyau, et à moins qu'il n'ait le mot «secret», vous ne le verriez jamais. Vous vous retrouveriez donc avec un fichier de sortie vide, sans aucune idée de ce qui n'allait pas.
Cependant, puisque le canal capture uniquement stdout
, la decrypt
commande peut envoyer ses erreurs à l' stderr
endroit où elles seront affichées sur la console.
Vous pouvez rediriger stdout
et stderr
, ensemble ou indépendamment:
# Send errors to "errors.txt" and output to "secrets.txt"
# The following two lines are equivalent, as ">" means "1>"
decrypt $MY_FILE 2> errors.txt > secrets.txt
decrypt $MY_FILE 2> errors.txt 1> secrets.txt
Vous pouvez rediriger les erreurs stdout
et les traiter comme s'il s'agissait d'une sortie normale:
# The operation "2>&1" means "redirect file descriptor 2 to file
# descriptor 1. So this sends all output from stderr to stdout.
# Note that the order of redirection is important.
decrypt $MY_FILE > errors.txt 2>&1
# This may be confusing. It will store the normal output in a file
# and send error messages to stdout, where they'll be captured by
# the pipe and then sorted.
decrypt $MY_FILE 2>&1 > output.txt | sort
Vous pouvez également utiliser une notation "abrégée" pour rediriger à la fois stdout et stderr vers le même fichier:
decrypt $MY_FILE &> output.txt
Enfin, l' >
opérateur tronquera d' abord son fichier de sortie avant d'y écrire. Si, à la place, vous souhaitez ajouter des données à un fichier existant, utilisez l' >>
opérateur:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1