42 votes

Pourquoi rediriger la sortie vers 2>&1 et 1>&2 ?

Je suis tombé sur plusieurs commandes qui utilisent 2>&1 et 1>&2, mais je n'arrive pas vraiment à comprendre l'utilité de les utiliser et quand je devrais les utiliser.

Ce que je comprends

Je sais que 1 représente la sortie standard et 2 représente l'erreur standard. Je comprends que 2>&1 combine la sortie de 2 à 1 et vice versa.

Ce que je ne comprends pas

  1. Quand devrais-je l'utiliser ?
  2. Quel est son but ?

43voto

James Mertz Points 390

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

2voto

Mohit Points 195

Une situation où vous en avez besoin est lorsque vous voulez afficher la sortie de strace dans un pager. strace imprime sa sortie sur la sortie d'erreur standard et les tuyaux relient généralement la sortie standard à l'entrée standard, donc vous devez utiliser la redirection :

strace -p $pid 2>&1 | less

2voto

rlanham Points 61

Parfois, vous voulez rediriger à la fois stdout (1) et stderr (2) vers le même emplacement (/dev/null, par exemple). Une façon d'y parvenir serait :

$ programme 1>/dev/null 2>/dev/null

Mais la plupart des gens raccourcissent cela en redirigeant stderr vers stdout avec 2>&1 :

$ programme 1>/dev/null 2>&1

Une version encore plus courte est :

$ programme >&- 2>&-

1voto

soandos Points 23540

2: C'est pour quand vous aurez une sortie provenant à la fois de l'erreur standard et de la sortie standard, et que vous voulez les composer dans une seule chaîne.

1: Quand vous voulez manipuler la sortie à la fois de l'erreur standard et de la sortie standard.

0voto

Willie Points 1

Le cas où la redirection de stderr vers stdout a déjà été abordé ici (par exemple, l'utiliser pour filtrer (grep) les messages d'erreur).

L'autre cas est de rediriger stdout vers stderr. Un cas d'utilisation courant (du moins pour moi) est d'envoyer les messages d'avertissement/erreur imprimés avec "echo" (dans mes scripts shell) vers stderr (afin qu'ils attirent plus facilement l'attention de l'utilisateur).

Par exemple,

echo "le fichier \"${file\" n'existe pas..." 1>&2

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X