Comment cmd & gt; / dev / null 2 & gt; & amp; 1 travail?
Je suis en train de lire sur la redirection des données à /dev/null
et donc j'ai essayé un test simple:
ping a.b.c # which results in an address not found
Si j'essaye ceci:
ping a.b.c > /dev/null # prints the same error message as the one above
Cependant, si je fais ceci:
ping a.b.c > /dev/null 2>&1 # The error message is gone
Que la dernière solution est la solution souhaitée, mais ce qui se passe avec cette 2>&1
? Mes recherches jusqu'à présent suggèrent que 2
représente stderr
et 1
représente stdout
. Donc si j'ai lu de cette façon, on dirait que je suis la création d'un stderr
fichier et de rediriger les stdout
?
Si c'est le cas, quel est le &
dans cette commande?
source d'informationauteur hax0r_n_code
Vous devez vous connecter pour publier un commentaire.
Vous avez raison,
2
estSTDERR
1
estSTDOUT
. Lorsque vous ne2>&1
vous dites: "d'impression àSTDOUT
(1
) les choses qui vont àSTDERR
(2
)". Et avant cela, vous avez dit que votreSTDOUT
serait aller à/dev/null
. Par conséquent, rien n'est visible. Dans les exemples 1 et 2, vous obtenez le message de sortie, car il est imprimé àSTDERR
comme une redirection seulement redirigeSTDOUT
.Et quand vous faites de la redirection, vous ne créez pas un
STDERR
le processus de toujours avoir unSTDERR
et unSTDOUT
quand ils sont créés.Considérons le code suivant qui imprime le mot "stdout" à stdout et le mot "stderror" à stderror.
Noter que le '&' opérateur indique bash que 2 est un descripteur de fichier (qui pointe vers le stderr) et pas un nom de fichier. Si nous avons laissé de côté le " &", cette commande d'impression
stdout
vers la sortie standard, et de créer un fichier nommé "2" et écrivezstderror
.En expérimentant avec le code ci-dessus, vous pouvez voir par vous-même exactement comment les opérateurs de redirection de travail. Par exemple, en modifiant le fichier qui des deux descripteurs de 1,2, est redirigé vers
/dev/null
les deux lignes suivantes de code de supprimer tout le contenu de la sortie standard (stdout), et tout de stderror respectivement (l'impression qu'il en reste).Maintenant, nous approchons le point crucial de la question (en remplaçant mon exemple pour le vôtre), pourquoi ne
produisent pas de sortie? Pour vraiment comprendre cela, je vous recommande vivement de lire ce page web sur le descripteur de fichier tables. En supposant que vous avez fait de cette lecture, nous pouvons procéder. Notez que Bash processus de la gauche vers la droite; ainsi Bash voit
>/dev/null
première (qui est la même que1>/dev/null
), et définit le descripteur de fichier 1 pour pointer vers /dev/null au lieu de la sortie standard (stdout). Ayant fait cela, Bash se déplace ensuite rightwards et voit2>&1
. Cela définit le descripteur de fichier 2 pour pointer vers le même fichier comme descripteur de fichier 1 (et pas de descripteur de fichier 1 lui-même!!!! (voir cette ressource sur les pointeurs pour plus d'info) . Depuis le descripteur de fichier 1 pointe vers /dev/null, et le fichier de descripteur de 2 points pour le même fichier descripteur de fichier 1, le fichier descripteur de 2 aussi maintenant pointe vers /dev/null. Ainsi, les deux descripteurs de fichiers point à /dev/null, et c'est pourquoi aucune sortie n'est rendu.Pour tester si vous avez vraiment comprendre le concept, essayer de deviner la sortie quand on passe la redirection de l'ordre:
Le raisonnement ici est que l'évaluation de gauche à droite, Bash voit 2>,&1, et établit ainsi le descripteur de fichier 2 au point à la même place que descripteur de fichier 1, c'est à dire la sortie standard stdout. Il définit ensuite descripteur de fichier 1 (n'oubliez pas que >/dev/null = 1>/dev/null), point >/dev/null, donc la suppression de tout ce qui serait habituellement les envoyer à la norme. Ainsi, tout ce qui nous reste est celui qui n'a pas été envoyer sur la sortie standard dans le shell interne est exécuté (le code dans les parenthèses)- c'est à dire "stderror".
La chose intéressante à noter est que, même si 1 est un pointeur vers la sortie standard (stdout), en redirigeant le pointeur de 2 à 1 par l'intermédiaire d'
2>&1
ne forment PAS une chaîne de pointeurs 2 -> 1 -> stdout. Si elle le faisait, comme un résultat de la redirection de 1 à /dev/null, le code2>&1 >/dev/null
donnerait le pointeur de la chaîne d'2 -> 1 -> /dev/null, et donc le code à générer de rien, contrairement à ce que nous avons vu ci-dessus.Enfin, j'avais remarque qu'il y a un moyen plus simple de faire ceci:
De la section 3.6.4 icinous voyons que nous pouvons utiliser l'opérateur
&>
pour rediriger les deux stdout et stderr. Ainsi, pour rediriger la fois le stderr et stdout de toute commande de\dev\null
(qui supprime la sortie), il nous suffit de taper$ command &> /dev/null
ou dans le cas de mon exemple:
Plats à emporter clés:
2>&1 >/dev/null
est !=>/dev/null 2>&1
. On génère la sortie et l'autre pas!Enfin avoir un coup d'oeil à ces grandes ressources:
Bash Documentation sur la RedirectionUne Explication de Descripteur de Fichier TablesIntroduction aux Pointeurs