86 votes

Que fait "2>&1" dans la ligne de commande ?

Je sais que le > est utilisé pour la redirection de la sortie dans la ligne de commande, mais j'ai du mal à trouver quelque chose qui explique l'utilisation du signe 2>&1 dans la ligne de commande. Par exemple :

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

107voto

Kit Roed Points 1922

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

Alors 2>&1 dit d'envoyer l'erreur standard à l'endroit où la sortie standard est également redirigée. Et comme elle est envoyée vers /dev/null revient à ignorer toute sortie.

46voto

Jorge Bucaran Points 511

En résumé

Aller chercher http://www.google.com en el arrière-plan et jetez les deux stdout y stderr .

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

est la même chose que

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

Principes de base

0 , 1 y 2 représentent le fichier standard descripteurs sur POSIX systèmes d'exploitation. Un descripteur de fichier est une référence du système à (essentiellement) un fichier ou un prise de courant .

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

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

La plupart des commandes du système Unix prennent une entrée et affichent le résultat dans le terminal. curl récupérera tout ce qui se trouve dans l'url spécifiée ( google point com ) et afficher le résultat à stdout .

curl result

Redirection

Comme vous l'avez dit < y > sont utilisés pour rediriger la sortie d'une commande vers un autre endroit, comme un fichier.

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

> /dev/null 2>&1

La première partie > /dev/null redirige le stdout c'est-à-dire curl à la sortie de /dev/null (plus d'informations à ce sujet prochainement) et 2>&1 redirige le stderr à la stdout (qui vient d'être redirigé vers /dev/null donc tout sera envoyé à /dev/null ).

Le côté gauche de 2>&1 vous dit qué sera redirigé, et le côté droit vous indique à. Le site & est utilisé sur le côté droit pour distinguer stdout (1) ou stderr (2) à partir de fichiers nommés 1 ou 2 . Donc, 2>1 finira par créer un nouveau fichier (s'il n'existe pas déjà) nommé 1 et de jeter le stderr résultat là-dedans.

/dev/null

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

> /dev/null

Mais pourquoi il y a encore des choses qui s'affichent sur le terminal . C'est no curl mais les données envoyées à l'interface utilisateur de la stderr utilisé ici pour afficher des informations de progression et de diagnostic et pas seulement erreurs .

curl http://www.google.com > /dev/null 2>&1 ignore les deux curl et curl de l'information sur les progrès réalisés. Le résultat est que rien n'est affiché sur le terminal.

Enfin

El & à la fin est la façon dont vous dites au Shell d'exécuter la commande en tant que emploi en el arrière-plan . Cela entraîne le prompt pour revenir immédiatement alors que la commande est exécutée de manière asynchrone dans les coulisses. Pour voir les travaux en cours, tapez jobs dans votre terminal. Notez que c'est différents des processus en cours dans votre système. Pour les voir, tapez top dans le terminal.

Références

5voto

Dalroth Points 2468

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

0voto

YaOzI Points 549

Ma compréhension est la suivante :

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

Et parfois, vous souhaitez enregistrer les informations de sortie dans un fichier au lieu de l'écran du terminal pour les examiner plus tard, alors vous pouvez écrire : curl http://www.google.com > logfile

Mais de cette manière, l'information StdErr sera omise, puisque > redirige seulement le StdOut vers logfile .

Donc, si vous vous souciez des informations d'erreur de la commande lorsqu'elle ne s'exécute pas, vous devez combiner StdOut avec StdErr en utilisant 2>&1 (ce qui signifie transformer StdErr en StdOut), de sorte que la ligne de commande suivante peut être écrite : curl http://www.google.com > logfile 2>&1

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