web-dev-qa-db-fra.com

Que fait "2> & 1" en ligne de commande?

Je sais que le signe > est utilisé pour la redirection de sortie en ligne de commande, mais je ne parviens pas à trouver quelque chose qui explique l'utilisation de 2>&1 en ligne de commande. Par exemple:

curl http://www.google.com > /dev/null 2>&1 &
59
Matt Huggins

Le 1 indique la sortie standard (stdout). Le 2 dénote l'erreur standard (stderr).

Donc, 2>&1 dit d'envoyer l'erreur standard à chaque fois que la sortie standard est également redirigée. Comme cela a été envoyé à /dev/null, cela revient à ignorer toute sortie.

77
Chealion

tl; dr

Récupérez http://www.google.com à l'arrière-plan et supprimez les stdout et stderr.

curl http://www.google.com > /dev/null 2>&1 &

est le même que

curl http://www.google.com > /dev/null 2>/dev/null &

Les bases

0, 1 et 2 représentent les descripteurs de fichier standard en POSIX systèmes d'exploitation. Un descripteur de fichier est une référence système à (essentiellement) un fichier ou socket .

La création d'un nouveau descripteur de fichier en C peut ressembler à ceci:

fd = open("data.dat", O_RDONLY)

La plupart des commandes système Unix prennent certaines entrées et transmettent le résultat au terminal. curl récupérera tout ce qui se trouve à l'URL spécifiée ( google dot com ) et affichera le résultat sous la forme stdout.

curl result

La redirection

Comme vous l'avez dit, < et > sont utilisés pour rediriger le résultat d'une commande vers un autre emplacement, tel qu'un fichier.

Par exemple, dans ls > myfiles.txt, ls récupère le contenu du répertoire actuel et > redirige sa sortie sur myfiles.txt (si le fichier n'existe pas, il est créé, sinon écrasé, mais vous pouvez utiliser >> au lieu de > pour ajouter au fichier). Si vous exécutez la commande ci-dessus, vous remarquerez que rien n’est affiché sur le terminal. Cela signifie généralement le succès sur les systèmes Unix. Cochez cette cat myfiles.txt pour afficher le contenu du fichier à l'écran.

>/dev/null 2> & 1

La première partie > /dev/null redirige la stdout, c'est-à-dire la sortie de la curl vers /dev/null (plus d'informations à ce sujet à l'avenir) et 2>&1 redirige la stderr vers la stdout (qui vient d'être redirigée vers /dev/null afin que tout soit envoyé à /dev/null).

Le côté gauche de 2>&1 vous indique ce que sera redirigé, tandis que le côté droit vous indiquera . Le & est utilisé à droite pour distinguer stdout (1) ou stderr (2) des fichiers nommés 1 ou 2. Donc, 2>1 finirait par créer un nouveau fichier (s'il n'existe pas déjà) nommé 1 et dump le résultat stderr.

/dev/null

/dev/null est un fichier vide, un mécanisme utilisé pour supprimer tout ce qui y est écrit. Donc, curl http://www.google.com > /dev/null supprime efficacement la sortie de curl.

> /dev/null

Mais pourquoi y at-il encore des éléments affichés sur le terminal ?. Il s’agit de la sortie normale de non curl, mais des données envoyées à la stderr, utilisées ici pour afficher les informations de progression et de diagnostic et pas seulement les erreurs .

curl http://www.google.com > /dev/null 2>&1 ignore les informations de sortie de curl et de curls. Le résultat est que rien n'est affiché sur le terminal.

Finalement

Le & à la fin indique comment vous demandez au shell d’exécuter la commande en tant que travail en arrière-plan . Ainsi, l'invite est renvoyée immédiatement lorsque la commande est exécutée de manière asynchrone dans les coulisses. Pour voir les tâches en cours, saisissez jobs dans votre terminal. Notez que ceci est différent des processus en cours d'exécution sur votre système. Pour voir ces types top dans le terminal.

Références

22
Jorge Bucaran

2 fait référence à STDERR. 2>&1 enverra STDERR au même endroit que 1 (STDOUT).

5
John T

Je comprends comme suit:

Si vous souhaitez uniquement lire les informations de sortie et d'erreur de la commande à l'écran, écrivez simplement: curl http://www.google.com

Et parfois, si vous souhaitez enregistrer les informations de sortie dans un fichier au lieu de l’écran du terminal pour une vérification ultérieure, vous pouvez écrire: curl http://www.google.com > logfile

Mais de cette manière, les informations StdErr seront omises, étant donné que > redirige uniquement le StdOut vers logfile.

Donc, si vous vous souciez des informations d'erreur de la commande après son échec, vous devez combiner StdOut avec StdErr en utilisant 2>&1 (ce qui signifie que fold StdErr dans StdOut), afin que la ligne de commande suivante puisse être écrite: curl http://www.google.com > logfile 2> & 1

0
YaOzI