Redirection de stderr

Il y a quelque chose qui me dérange beaucoup. Je veux redirect stderr à permet de dire fd 5. Donc, je lance la commande suivante:

me@/home/me>$ exec &2>5 [1] 307 

Donc, ce que j’attends comme résultat de cette redirection, c’est qu’à partir de maintenant, les erreurs seront envoyées à fd 5. Mais c’est ce qui se passe:

 me@/home/me>$ mkdir /a 5>/dev/null mkdir: /a: [Permission denied] 

Il montre encore l’erreur sur stdout. Alors que lorsque je redirige 2, il ne montre rien:

 me@/home/me>$ mkdir /a 2>/dev/null 

Quelqu’un peut-il s’il vous plaît expliquer où je me trompe?

 exec &2>5 

Cela ne redirige pas stderr vers le descripteur de fichier 5. Il le redirige vers un fichier nommé 5 . Notez que comme Glenn Jackman mentionné dans un commentaire, cela se fait dans le sous-shell créé par background uniquement exec (le & que vous avez utilisé ne signifie pas que 2 sera traité comme un descripteur de fichier. Cela signifie que exec sera appelé en arrière-plan!

 mkdir /a 5>/dev/null 

Ce descripteur de fichier redirigé 5 vers /dev/null .

Vous pouvez redirect stderr vers un fichier comme celui-ci:

 mkdir /a 2>some-file 

Maintenant, regardez la différence entre ceux-ci:

 mkdir /a 2>&1 # redirect stderr to fd 1, which is stdout mkdir /a 2>1 # redirect stderr to file named "1" mkdir /a >x 2>&1 # redirect stdout to x, AND stderr to stdout, which also goes into x mkdir /a 2>&5 # redirect stderr to fd 5, presuming there IS an open file with fd 5