Parfois, vous voulez rediriger à la fois stdout et stderr vers le même emplacement, C'est là que >&
est utilisé - il pointe un descripteur de fichier vers un autre.
Par exemple, si vous voulez écrire à la fois stdout et stderr dans le même fichier (que ce soit /dev/null
ou output.txt
), vous pouvez les rediriger séparément, avec
app 1>/dev/null 2>/dev/null
ou vous pourriez 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 n°2 là où le n°1 pointe déjà. Le deuxième exemple permet d'atteindre le même résultat en commençant par stderr.
Par exemple, il arrive que stdout (descripteur de fichier n°1) pointe déjà vers l'emplacement souhaité, mais vous ne pouvez pas le nommer (il peut être associé à un tuyau, une prise, ou autre chose). Cela se produit souvent lors de l'utilisation de l'expansion de processus (les opérateurs ` `
ou $( )
), qui capture normalement seulement stdout, mais vous voudriez inclure stderr. Dans ce cas, vous utiliseriez aussi >&
pour pointer stderr vers stdout :
out=$(app 2>&1)
Un autre exemple courant est un pager, ou grep
, ou un utilitaire similaire, puisque le tuyau |
fonctionne normalement seulement sur stdout, vous redirigeriez stderr vers stdout avant d'utiliser le tuyau :
app 2>&1 | grep hello
Comment savoir si 2>&1
ou 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 n°2 vers le descripteur de fichier n°1".)
Certaines shells ont des raccourcis pour des redirections courantes; voici des exemples de Bash :
-
1>
peut être abrégé en juste >
-
1>foo 2>&1
en >&foo
ou &>foo
-
2>&1 | program
en |& program