La Lanterne Rouge

La Lanterne Rouge

Warning: Geek Inside

Publié le par Nanawel
Publié dans : #linux | #terminal | #shell | #redirection | #bash | #unix | #NULL

Si comme moi vous êtes un gros flemmard qui n'est pas curieux au point de se demander pourquoi il croise régulièrement cette redirection

$ macommande > /dev/null 2>&1

dans les scripts shells qu'il édite et réutilise, alors je vous conseille de lire cet article qui va vous l'expliquer en quelques lignes. C'est peut être tout con, mais c'est encore plus con de pas savoir l'expliquer.

 

Je résume et traduit grossièrement :

il faut se rappeler que tout processus possède 3 flux standards :

  • un d'entrée (typiquement le clavier)
  • et deux de sortie (la sortie standard et l'erreur étant généralement l'affichage).

Ces trois flux sont représentés par des constantes STDIN, STDOUT et STDERR dont les valeurs sont respectivement 0, 1 et 2.

La redirection du flux de sortie vers /dev/null avec ">" ne va concerner que STDOUT, mais pas STDERR. Les messages envoyés sur cette sortie vont donc se retrouver à l'écran (en tout cas sur la sortie courante, cela peut aussi être un fichier de log).

En précisant "2>/dev/null" on redirige uniquement STDERR.

En utilisant "2>&1" on précise "rediriger STDERR là où est redirigé STDOUT" (le "1"). Si STDOUT est précédemment redirigé vers /dev/null, alors STDERR suivra. C'est aussi simple que ça.

 

Vous dormirez ensuite moins bête ce soir, enfin j'espère pour moi en tout cas.

Commenter cet article

teklib 21/03/2016 17:43

Et donc est ce que je résume bien en disant que :
pour
macommande > /dev/null 2>&1
par exemple si je prend
cat monfichier.txt > /dev/null 2>&1
peux se traduire par je lance l'affichage du fichier monfichier.txt et je l'affiche pas à l'ecran (car >dev/null) je récupère les messages d'erreurs (par exemple le fichier n'existe pas..) qui correspond au chiffre 2 et je les envoie où est redirigé la sortie d'écran qui correspond au chiffre 1.
donc si je résume on récupère juste les messages d'erreurs à afficher ...
Du coup ma commande ne sert à grand chose :s

est ce que tu aurais des exemples de bonne utilisation de cette redirection?et expliquer quoi va où?

il y a un autre point le &0 récupère le STDIN , est ce que cela veut dire que si on veut afficher ce qu'on tape à l'écran on peut faire &0 > &1 ?

un exemple d'utilisation avec &0 ?

J'avoue j'ai la flemme aussi de faire mes recherches sur Goog** et tes explications me donne envie d'en savoir plus et d'essayer d'enfin comprendre ces bouts de charabia (pour moi)lol

merci en tout cas pour l'article

Nanawel 21/03/2016 18:59

Dans le cas d'une redirection vers /dev/null, il y a des cas où tu ne souhaites pas que les messages d'info ou d'erreur d'une commande viennent s'inscrire sur la sortie en cours (l'affichage d'un terminal, ou le fichier de log, selon). Évidemment, avec la commande "cat" c'est un peu plus rare, car elle sert quand même à lire le contenu d'un fichier vers celle-ci.

Pour une redirection vers un fichier de log, cela permet de ne pas répéter le nom du fichier en question, surtout s'il est dynamique (avec le timestamp courant par exemple).

Pour ta question concernant &0 je n'ai pas d'exemple, mais comme tu dis toi-même que tu as la flemme de chercher, je ne vais pas bosser à ta place non plus ! ;)

Tuxlover 05/02/2014 16:28

Bonjour cher webmaster,
Sans vouloir vous contredire il me semble qu'il y a une grossière erreur dans votre post.D'ailleurs vous vous contredisez vous même:
je vous cite: "1 d'entrée (typiquement le clavier)
et 2 de sortie (la sortie standard et l'erreur étant généralement l'affichage)."
Suivie de "Ces trois flux sont représentés par des constantes STDIN, STDOUT et STDERR dont les valeurs sont respectivement 0, 1 et 2."
1 et 2 représentent les sorties respectivement sortie standard et sortie d'erreurs :D
0 est donc le stdin ou l'entrée standard qui correspond aussi au clavier.

En espérant que cela aide les prochains lecteurs,

Cordialement,

Tuxlover 06/02/2014 14:49

Effectivement!!

Nanawel 05/02/2014 16:39

En fait non je n'ai pas dit le contraire, mais je t'accorde que ce n'est pas forcément clair même si j'ai essayé de l'être :)
Il faut lire "un (flux) d'entrée et deux (flux) de sortie", qui correspondent ensuite à 0, 1 et 2. Les premiers chiffres sont utilisés pour dénombrer les flux, pas pour les identifier et encore moins pour donner leurs équivalents en termes de constantes !

Mais tu as tout à fait raison, ce n'est pas clair. Je vais donc modifier le texte et remplacer les chiffres par des mots, beaucoup plus clairs.

Merci !

chouf 10/12/2013 16:39

ah ah je confirme, je suis tombé sur ce blog avec le 1er résultat de google ! en tout cas, merci pour l'explication !

Almiriad 26/08/2013 12:00

Une collègue ne comprenait pas la commande "/dev/null 2>&1" et ton blog a été le premier a sortir en résultat sur google !
Même avant stack overflow !! Alors soit google t'aime beaucoup, soit google espione mon activité sur le web...

Mais bon s'ils le faisaient ça se saurait...

Nanawel 26/08/2013 12:33

Non je suis super bien placé dans Google sur cette page, je saurais pas trop dire pourquoi (peut-être que c'est pertinent ce que je dis des fois ^^).