Réponses:
Si vous êtes un programmeur C, vous pouvez penser &1à "l'adresse de 1", donc 2>&1"rediriger le descripteur de fichier # 2 au même endroit que # 1".
"Deux à un" ("à" l'être >) a plus de sens logique pour moi que "Deux à un", ce avec quoi je pourrais généralement le confondre. Si vous considérez «et un» comme un seul nom (un lieu), cela a également un sens grammatical dans le contexte, ce qui est plus difficile à faire avec «deux et un» - vous devez considérer «un» comme un seul nom, et cela n'aurait toujours pas de sens contextuel.
Pas un mnémonique, mais je l'ai lu comme suit:
0est stdin.
1est stdout.
2est stderr.
>est dans.
<est sorti.
&est le descripteur de fichier (dans certains shells).
2>&1
2 > & 1
stderr into file descriptor 1
redirect stderr into stdout
Cela pourrait changer si vous avez joué avec l'un des descripteurs de fichiers avant la redirection ...
2>somefile 1>&2
2 > somefile 1 > &2
stderr into somefile and stdout into file descriptor 2
redirect stderr into somefile and stdout into somefile.
Lorsque vous écrivez 2>&1, vous dites que "l'erreur standard va à la sortie standard".
Décomposons cela.
Vous voulez d'abord mémoriser que l'erreur standard est 2et que la sortie standard est 1.
Vous avez donc 2quelque chose quelque chose 1.
"va à" est écrit >.
Vous avez donc 2>quelque chose 1.
2>filenamesignifie envoyer l'erreur standard à filename. Mais vous ne voulez pas l'envoyer dans un fichier appelé 1. Vous voulez autre chose: le numéro d'un fichier déjà ouvert. C'est pour ça &.
Alors 2>&1.
Vous pouvez également y penser comme si vous faisiez une mission, où l' >est comme un égal et l' &est comme un $, comparez:
f=$1
2>&1
Pour comprendre une ligne de commande avec plusieurs redirections, la chose importante à savoir est que les redirections se font de gauche à droite. Voir Ordre des redirections pour plus de détails à ce sujet.
Je me suis souvenu qu'il est toujours 2 -> 1. Stderr à stdout.
La partie médiane est toujours la plus difficile et je l'ai toujours gâchée, jusqu'à ce que je me souvienne que vient d'abord le caractère pointu >, puis le personnage que je ne peux pas écrire dans la vraie vie &.
Alors jamais 2&>1, toujours2>&1
Si vous comprenez que FD2 est STDERR, vous pourriez penser, "Oh, et capturez STDERR partout où j'envoie STDOUT (FD1)".
Mes collègues et moi disons généralement "deux est supérieur à un", car la plupart d'entre nous ne se souviennent pas toujours que stderrc'est un descripteur de fichier 2et qu'il l' stdoutest 1(en particulier ceux qui sont nouveaux pour unix / linux), donc les autres mnémoniques sur la redirection stderrne fonctionnent pas vraiment . Seul problème, vous devez toujours vous rappeler où va l'esperluette!