Comme les autres l'ont dit, linux fournit deux flux de sortie différents :
stdout ou "sortie standard" est l'endroit où vont toutes les sorties régulières.
Vous pouvez le référencer en utilisant le descripteur de fichier 1
.
stderr ou "erreur standard" est un flux séparé pour les informations hors bande.
Vous pouvez le référencer en utilisant le 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
Maintenant, imaginez le decrypt
échoue et génère un message d'erreur. S'il envoie ce message à stdout
Il l'envoie dans le tube, et à moins qu'il ne contienne le mot "secret", vous ne le verrez jamais. Donc vous vous retrouveriez avec un fichier de sortie vide, sans aucune idée de ce qui a mal tourné.
Cependant, puisque le tuyau ne capture que stdout
le decrypt
peut envoyer ses erreurs à stderr
où ils seront affichés sur la console.
Vous pouvez rediriger stdout
y 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 vers 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 " raccourcie " pour rediriger les deux stdout et stderr dans le même fichier :
decrypt $MY_FILE &> output.txt
Et, enfin, le >
L'opérateur commencera par tronqué son fichier de sortie avant d'y écrire. Si, au contraire, vous souhaitez ajouter dans un fichier existant, utilisez la fonction >>
opérateur :
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1