Je sais ce que
program > /dev/null 2>&1
Est-ce que. Il redirige la sortie vers /dev/null
et 2>&1
signifie pour rediriger la sortie d'erreur au même endroit où la sortie est envoyée.
Mon problème est que je dois toujours google parce que je ne m'en souviens jamais.
Alors, j'essaie &2>1
, 1>2&
, 1>&2
... J'essaie toutes les combinaisons jusqu'à ce que je google ...
Quelle est l'astuce pour s'en souvenir facilement?
program 1> /dev/null 2>/dev/null
. Il arrive parfois que vous ayez besoin de mélanger les élémentsstdout
etstderr
ensemble pour voir ce qui se passe réellement - par exemple, la sortie d’un processus de compilation complexe redirigé vers un fichier. Dans ce cas, jeRéponses:
La sortie est meilleure que l’erreur alors c’est la première (1 vs 2).
>
est un raccourci pour «va à». À gauche, ce que je veux envoyer et à droite, où je veux l'envoyer. Puisque 'où' est (presque) toujours un fichier, quelque chose commeserait redirigé vers un fichier nommé 1. Ainsi, l'esperluette
(&)
modifie le descripteur de fichier à fichier.Malheureusement, je n'ai pas encore développé ni développé ma propre mnémonique, mais lorsque j'ai appris * nix pour la première fois, j'ai trouvé cette façon logique de bien travailler. Après quelques essais, cela devient une seconde nature.
la source
stdout
est le descripteur de fichier 1,stderr
est 2. Donc, "erreur" vient avant "sortie".stdout
et sestderr
référer.Une astuce consiste simplement à se rappeler que 1 = sortie standard, 2 = erreur standard. Alors:
2>&1
= le flux d'erreur standard entre dans le flux de sortie standard.1>&2
= vice versa.Si vous avez déjà programmé dans une langue semblable à C, il est facile de se souvenir de l'esperluette (
&
). J'ai choisi d'y penser comme faisant référence à "l'adresse du" descripteur de fichier existant, afin que vous ne modifiiez pas le fichier lui-même ni n'en créiez un nouveau.la source
Voir le
&
nœud peut aider: pensez à ce que vous voulez faire en prenant la sortie de 2, donc2>
, et en la liant avec 1, donc2>&1
la source
En fait, cela dépend du shell que vous utilisez. Bash est généralement très tolérant et vous pouvez simplement faire:
la source
Considérons ces trois options:
Le premier envoie stderr à un nom de fichier "1": après tout, bash s'attend à être redirigé vers un fichier.
La seconde redirige également vers le même fichier mais s’exécute
program
en arrière-plan: c’est ce qu’un&
supposé est supposé vouloir dire.Cela laisse la troisième possibilité comme la seule à avoir un sens dans l'univers bash pour la redirection vers un descripteur de fichier.
Comment se rappeler lequel est lequel parmi 0, 1, 2? Pensez à faire fonctionner un ordinateur à partir de la console. Tout d'abord, vous devez taper quelque chose (0 = stdin). Ensuite, vous voyez la sortie (1 = stdout). Enfin et seulement si quelque chose ne va pas, vous voyez stderr (2).
la source
Dessine-le dans ton fond d'écran.
Maintenant, sérieusement, ceci et d'autres éléments de base que je ne cessais d'oublier, j'ai donc ajouté un menu de conseils rapides à une application que j'ai développée et que j'utilise quotidiennement. Vous voudrez peut-être essayer ou utiliser quelque chose comme gnote pour conserver une note.
la source
En ce qui concerne le shell bash, je trouve que la meilleure façon de se souvenir est de comprendre ce qui se passe.
Si tout ce que vous voulez faire est de vous rappeler comment obtenir la commande correcte, vous pouvez essayer
C'est beau et évident ce qui se passe et facile à retenir. c'est à dire
1
STDOUT va/results
2
STDERR se rend également directement à/results
le problème est que cela ne fonctionne pas comme prévu. considérer ce qui suit:
fichier:
/tmp/poem.txt
et exécutez la commande
puis
que s'est-il passé ici?
Je crois comprendre que bash configure la redirection pointant le STDERR directement vers le fichier
/tmp/results
et en raison de la nature de>
ce qui fait 2 choses>>
fait.Donc, dans ce cas, STDERR, insère directement au début du
/tmp/results
remplacement de la sortie de STDOUT.Remarque: si vous aviez l'habitude
>>
d'ajouter, vous pourriez probablement vous en tirer avec cette syntaxe.Cependant, pour résoudre le problème dont vous avez besoin - non pas pour rediriger STDERR - directement vers le fichier, mais plutôt pour fusionner la sortie de STDERR dans le flux STDOUT, afin d'éviter toute collision.
En utilisant l'opérateur, l'
2>&1
opérateur réalise ceciLe
&
permet bash de distinguer d'un fichier nommé1
et le1
descripteur de fichier.Pour moi, la déclaration
2>&1
elle-même explique exactement ce qui se passe - STDERR est redirigé vers STDOUT lui-même - et ne se termine que/tmp/results
parce que c'est là que STDOUT est pointé (presque comme un effet secondaire).Contrairement à ce que beaucoup de guides affirment, c’est-à-dire que
2>&1
STDERR est envoyé partout où STDOUT est pointé. Si cela était vrai, vous auriez toujours le problème de réécriture.Pour plus d'informations, voir http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
la source