Explorons ce qui se passe lorsqu'une commande génère une erreur. Essayez de lister le contenu d'un répertoire qui n'existe pas et redirigez la sortie vers un fichier nommé peanuts.txt.
ls /fake/directory > peanuts.txt
Au lieu d'une invite propre, vous verrez un message d'erreur sur votre écran :
ls: cannot access /fake/directory: No such file or directory
Vous vous demandez peut-être pourquoi ce message n'a pas été envoyé au fichier. C'est parce qu'un autre flux d'E/S est en jeu : l'erreur standard, ou stderr.
Qu'est-ce que l'erreur standard (Standard Error) sous Linux ?
Sous Linux, stderr est un flux de sortie par défaut utilisé par les programmes pour envoyer des messages d'erreur et des diagnostics. Il est complètement séparé du flux de sortie standard (stdout), qui est utilisé pour la sortie normale du programme. Par défaut, stdout et stderr envoient leur sortie à l'écran de votre terminal, c'est pourquoi vous voyez le message d'erreur directement.
Pour contrôler stderr, vous avez besoin d'une méthode de redirection différente.
Comprendre les descripteurs de fichiers
Pour gérer les flux d'E/S comme stdin, stdout et stderr, le système utilise des descripteurs de fichiers. Un descripteur de fichier est un nombre entier non négatif que le noyau utilise pour identifier un fichier ou un flux ouvert. Les descripteurs de fichiers par défaut sont :
0: stdin (entrée standard)1: stdout (sortie standard)2: stderr (erreur standard)
Le nombre 2 est le descripteur de fichier stderr dédié, et nous pouvons l'utiliser pour contrôler où vont les messages d'erreur.
Rediriger stderr vers un fichier
Pour rediriger stderr vers un fichier, vous utilisez le descripteur de fichier 2 suivi de l'opérateur >. Cette commande enverra tous les messages d'erreur dans le fichier stderr spécifié.
ls /fake/directory 2> peanuts.txt
Maintenant, votre terminal sera silencieux et le message d'erreur se trouvera dans peanuts.txt.
Combiner stdout et stderr
Et si vous souhaitez capturer à la fois la sortie normale et les messages d'erreur dans le même fichier ? Vous pouvez y parvenir en redirigeant les deux flux.
ls /fake/directory /etc/passwd > peanuts.txt 2>&1
Décortiquons cela :
> peanuts.txtredirigestdout(descripteur de fichier 1) vers le fichierpeanuts.txt.2>&1redirigestderr(descripteur de fichier 2) vers le même emplacement que celui vers lequelstdout(descripteur de fichier 1) pointe actuellement.
L'ordre est important. 2>&1 envoie stderr vers la destination actuelle de stdout. Dans ce cas, stdout pointe vers un fichier, donc stderr est également envoyé vers ce fichier.
Une manière plus moderne et plus courte de rediriger à la fois stdout et stderr est d'utiliser &>.
ls /fake/directory /etc/passwd &> peanuts.txt
Jeter les messages d'erreur
Parfois, vous voudrez peut-être exécuter une commande et ignorer complètement tout message d'erreur potentiel. Pour ce faire, vous pouvez rediriger stderr vers un fichier spécial appelé /dev/null, qui supprime toutes les données qui y sont écrites.
ls /fake/directory 2> /dev/null
Cette commande s'exécutera, et toute sortie d'erreur provenant de stderr sera envoyée à /dev/null et supprimée, laissant votre écran propre.