Pourquoi la redirection de STDERR vers / dev / null se fait-elle de cette façon?

29

Cela n'a pas de sens pour moi.

wibble > /dev/null 2>&1

Je pense que cela aurait plus de sens si c'était quelque chose comme ça:

wibble 2>&1 > /dev/null

En d'autres termes

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Quelle est la pensée derrière l'ordre de la redirection de commande xxx > /dev/null 2>1?

qui suis je
la source
6
Vous pourriez également trouver cette explication utile.
rozcietrzewiacz
Merci @rozcietzewiacz qui explique exactement ma question
whoami
1
Il y a un excellent passage au milieu de cette page sur le wiki de Greg: «Si vous êtes toujours confus à ce stade, c'est probablement parce que vous avez commencé avec une idée fausse sur le fonctionnement des FD, et que vous n'avez pas pu abandonner cette idée fausse encore. Ne vous inquiétez pas - c'est une idée fausse extrêmement courante, et vous n'êtes pas seul. … Beaucoup de gens pensent qu'en 2>&1quelque sorte «unit» ou «lie» ou «épouse» les deux FD, de sorte que tout changement [ultérieur] de l'un d'eux devient un changement de l'autre. Ce n'est pas le cas. »
G-Man dit« Réintègre Monica »le

Réponses:

41

Les redirections sont traitées de gauche à droite. Si tu fais

2>&1 1> /dev/null

La première redirection indique stderrle flux vers lequel stdoutpointe à ce moment-là (qui est essentiellement votre tty). Il ne fait pas stderrd'alias stdout.

stdoutEst ensuite redirigé vers le compartiment de bits. La stdoutredirection n'affecte pas la stderrredirection précédente . stderrse réfère toujours à votre tty.

Alors:

ls file_that_doesnt_exist 2>&1 1> /dev/null

imprimera uniquement le message d'erreur sur votre terminal.

La bashpage de documentation de redirection le mentionne explicitement:

Notez que l'ordre des redirections est significatif. Par exemple, la commande

          ls > dirlist 2>&1

dirige à la fois la sortie standard et l'erreur standard vers la liste de fichiers, tandis que la commande

          ls 2>&1 > dirlist

dirige uniquement la sortie standard vers le fichier dirlist, car l'erreur standard a été dupliquée à partir de la sortie standard avant que la sortie standard ne soit redirigée vers dirlist .

Tapis
la source
3
Yay résout mon énigme. Je pense toujours logiquement que c'est déroutant. mais j'ai trouvé une autre partie sur la même page qui est intéressante &>/dev/nullest sémantiquement équivalente à/dev/null 2>&1
whoami
1
Il convient de souligner que la page dont vous parlez fait partie du manuel de référence Bash . Il décrit évidemment bash . Il existe d'autres shells dans le monde, différents de bash, et &>et >&(lorsqu'ils ne sont pas utilisés dans le contexte 2>&1ou >&2, etc.) sont des bash-ismes et ne sont pas standard . Ils ne doivent pas être utilisés dans des scripts shell que vous souhaitez être portables.
G-Man dit `` Réintègre Monica '' le