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 &
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.
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 &
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
.
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.
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 où . 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
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
.
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 curl
s. Le résultat est que rien n'est affiché sur le terminal.
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.
2
fait référence à STDERR. 2>&1
enverra STDERR au même endroit que 1
(STDOUT).
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