Je sais que le >
signe est utilisé pour la redirection de sortie dans la ligne de commande, mais je ne parviens pas à trouver quelque chose qui explique l'utilisation de 2>&1
dans la ligne de commande. Par exemple:
curl http://www.google.com > /dev/null 2>&1 &
command-line
shell
redirection
Matt Huggins
la source
la source
Réponses:
Le
1
désigne la sortie standard (stdout). Le2
indique l'erreur standard (stderr).Ainsi, il est
2>&1
recommandé d’envoyer une erreur standard là où la sortie standard est redirigée. Comme cela a été envoyé, cela/dev/null
revient à ignorer toute sortie.la source
0
(stdin),1
(stdout) et2
(stderr) sont en fait des descripteurs de fichier, le shell requiert une esperluette et une mise en avant pour la redirection. Dans ce cas, il duplique le descripteur de fichier en fusionnant efficacement les deux flux d’informations.curl http://www.google.com 2>/dev/null
Comment la ligne de commande sait-elle que le "2" désigne ici stderr et qu'il ne s'agit pas du deuxième paramètre que je passe à la commande curl?stderr
directement à la/dev/null
place. Vous pouvez le voir dans la pratique en essayantcurl
,curl 1>/dev/null
etcurl 2>/dev/null
juste pour voir le changement de sortie. Encore une fois, l'esperluette n'est nécessaire que pour le descripteur de fichier redirigé.tl; dr
Chercher
http://www.google.com
en arrière - plan et jeter lestdout
etstderr
.est le même que
Les bases
0
,1
et2
représentent les descripteurs de fichier standard dans les systèmes d’exploitation POSIX . Un descripteur de fichier est une référence système à (fondamentalement) un fichier ou un socket .0 stdin
1 stdout
2 stderr
La création d'un nouveau descripteur de fichier en C peut ressembler à ceci:
La plupart des commandes système Unix prennent certaines entrées et transmettent le résultat au terminal.
curl
va chercher ce qui se trouve à l'URL spécifiée ( google dot com ) et afficher le résultatstdout
.La redirection
Comme vous l' avez dit
<
et l'>
habitude de rediriger la sortie d'une commande à un autre endroit, comme un fichier.Par exemple, dans
ls > myfiles.txt
,ls
récupère le contenu du répertoire en cours et>
redirige sa sortiemyfiles.txt
(si le fichier n'existe pas, il est créé, sinon écrasé, mais vous pouvez utiliser>>
plutôt que d'>
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 casecat myfiles.txt
pour afficher le contenu du fichier à l'écran.> / dev / null 2> & 1
La première partie
> /dev/null
redirige lastdout
, sacurl
sortie vers/dev/null
(plus à ce sujet à l’avance) et2>&1
redirige lestderr
vers lestdout
(qui a été redirigé vers/dev/null
afin que tout soit envoyé à/dev/null
).Le côté gauche de
2>&1
vous indique ce qui va être redirigé et le côté droit vous indique où aller. Le&
est utilisé à droite pour distinguerstdout (1)
oustderr (2)
des fichiers nommés1
ou2
. Donc,2>1
créerait un nouveau fichier (s’il n’existait pas déjà)1
et nommait lestderr
résultat./ 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 efficacementcurl
la sortie.Mais pourquoi y a- t -il encore des éléments sur le terminal? Ce ne sont pas
curl
des sorties régulières, mais des données envoyées à lastderr
, utilisées ici pour afficher des informations de progression et de diagnostic et pas seulement des erreurs .curl http://www.google.com > /dev/null 2>&1
ignore les informationscurl
de sortie et decurl
progression. Le résultat est que rien n'est affiché sur le terminal.finalement
À
&
la fin, vous indiquez au shell d'exécuter la commande en tant que tâche en arrière - plan . Cela provoque le retour immédiat de l' invite lorsque la commande est exécutée de manière asynchrone en coulisse. Pour voir les emplois en cours tapezjobs
dans votre terminal. Notez que cela diffère des processus en cours d'exécution sur votre système. Pour voir ces typestop
dans le terminal.Références
la source
/dev/null
? Ne voulez-vous pas que les résultats d'curl
au moins quelque part soient utiles?2
fait référence à STDERR.2>&1
enverra STDERR au même endroit que1
(STDOUT).la source
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 façon, les informations StdErr seront omises, puisque
>
seulement rediriger le StdOut verslogfile
.Donc, si vous vous souciez des informations d'erreur de la commande une fois son exécution échouée, vous devez combiner StdOut avec StdErr en utilisant
2>&1
(ce qui signifie replier StdErr en StdOut), afin que la ligne de commande suivante puisse être écrite:curl http://www.google.com > logfile
2> & 1la source