Parfois, vous souhaitez rediriger à la fois stdout et stderr vers le même emplacement, c'est quand >&
est utilisé - il pointe un descripteur de fichier vers un autre.
Par exemple, si vous souhaitez écrire à la fois stdout et stderr dans le même fichier (que ce /dev/null
soit ou output.txt
), vous pouvez les rediriger séparément, avec
app 1>/dev/null 2>/dev/null
ou vous pouvez rediriger un descripteur de fichier vers le fichier, et l'autre descripteur de fichier dans le premier:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Dans le premier exemple, 2>&1
pointe le descripteur de fichier # 2 vers l'endroit où # 1 pointe déjà. Le deuxième exemple obtient le même résultat, commençant simplement par stderr à la place.
Comme autre exemple, il y a des cas où stdout (descripteur de fichier # 1) pointe déjà vers l'emplacement souhaité, mais vous ne pouvez pas y faire référence par son nom (il peut être associé à un tuyau, une prise ou autre). Cela se produit souvent lorsque vous utilisez l'expansion de processus (les opérateurs ` `
ou $( )
), qui ne capture normalement que stdout, mais vous souhaiterez peut-être y inclure stderr. Dans ce cas, vous utiliseriez également >&
pour pointer stderr vers stdout:
out=$(app 2>&1)
Un autre exemple courant est un pageur, ou grep
un utilitaire similaire, car le canal |
ne fonctionne normalement que sur stdout, vous redirigez stderr vers stdout avant d'utiliser le canal:
app 2>&1 | grep hello
Comment savoir lequel 2>&1
ou qui 1>&2
est correct? Le descripteur de fichier déjà configuré va à droite de >&
et le descripteur de fichier que vous souhaitez rediriger va à gauche. ( 2>&1
signifie "pointer le descripteur de fichier # 2 vers le descripteur de fichier # 1".)
Certains shells ont des raccourcis pour les redirections courantes; voici des exemples de Bash:
app 1>/dev/null 2>&1
signifierait que 2> & 1 pointerait vers le fichier vers lequel 1 était déjà en train de rediriger. Je suppose que je pourrais tout aussi facilement le faireapp > /dev/null &>
?