Redirection de l'erreur standard et combinaison des flux
Dans cette étape, vous apprendrez à rediriger l'erreur standard (stderr
) et à combiner stdout
et stderr
en un seul flux. Ceci est crucial pour gérer les messages d'erreur générés par les commandes, vous permettant de les enregistrer ou de les ignorer selon vos besoins.
Rappelons que stderr
est le descripteur de fichier 2
. Nous utilisons 2>
pour rediriger les messages d'erreur.
Redirection de l'erreur standard vers un fichier
Parfois, les commandes produisent des messages d'erreur que vous souhaitez capturer séparément de leur sortie standard.
-
Assurez-vous d'être dans votre répertoire ~/project
.
cd ~/project
[labex@host project]$
-
Essayons de lister le contenu d'un répertoire inexistant. Cela générera un message d'erreur.
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
Vous pouvez voir le message d'erreur imprimé directement sur le terminal.
-
Maintenant, redirigeons ce message d'erreur vers un fichier nommé errors.log
.
ls non_existent_directory 2> errors.log
Cette fois, vous ne verrez pas le message d'erreur sur votre terminal.
-
Vérifiez le contenu de errors.log
.
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
Le message d'erreur est maintenant stocké dans le fichier.
Ignorer l'erreur standard
Souvent, vous voudrez peut-être exécuter une commande qui produit des messages d'erreur bruyants dont vous ne vous souciez pas. Dans de tels cas, vous pouvez rediriger stderr
vers /dev/null
. /dev/null
est un fichier de périphérique spécial qui ignore toutes les données qui y sont écrites.
- Essayez à nouveau la commande
ls
avec le répertoire inexistant, mais cette fois, ignorez l'erreur.ls non_existent_directory 2> /dev/null
Vous ne verrez aucune sortie sur le terminal, et aucun message d'erreur n'est enregistré dans un fichier.
Combinaison de la sortie standard et de l'erreur standard
Il existe des situations où vous souhaitez capturer à la fois stdout
et stderr
dans le même fichier. Cela peut être fait de plusieurs façons.
Méthode 1 : > file 2>&1
Cette méthode redirige stdout
vers un fichier, puis redirige stderr
vers le même emplacement que stdout
. L'ordre 2>&1
est important : cela signifie "rediriger le descripteur de fichier 2 (stderr) vers le même endroit que le descripteur de fichier 1 (stdout)".
-
Créons une commande qui produit à la fois une sortie standard et une erreur standard. Nous utiliserons find
pour rechercher un fichier dans un répertoire où nous avons des permissions et dans un répertoire où nous n'en avons pas.
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
Ici, find ~/project -name "current_datetime.txt"
produira stdout
(si trouvé), et find /root -name "current_datetime.txt"
produira probablement stderr
en raison de problèmes de permissions.
-
Examinez le fichier combined_output.log
.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
Vous pouvez voir que la sortie réussie (le chemin d'accès au fichier) et le message d'erreur sont capturés dans le même fichier.
Méthode 2 : &> file
(Spécifique à Bash)
Bash fournit une abréviation pour combiner stdout
et stderr
dans un fichier : &>
. Ceci est équivalent à > file 2>&1
.
-
Essayons la même commande find
en utilisant l'abréviation &>
.
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
Vérifiez le contenu de combined_output_shorthand.log
.
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
Le résultat est le même que la méthode précédente, démontrant la commodité de &>
.
Ajout de flux combinés
Tout comme avec stdout
, vous pouvez ajouter stdout
et stderr
combinés à un fichier en utilisant >> file 2>&1
ou &>> file
.
-
Ajoutez plus de sortie et d'erreurs à combined_output.log
.
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
Affichez le combined_output.log
mis à jour.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
La nouvelle sortie et les erreurs sont ajoutées au contenu existant.
Vous avez maintenant appris avec succès comment rediriger l'erreur standard et comment combiner la sortie standard et l'erreur standard dans un seul fichier. Cette connaissance est essentielle pour des tâches de script et d'administration système robustes.