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