Ответы:
Если вы программист на C, вы можете думать &1как «адрес 1», поэтому 2>&1читается как «перенаправить дескриптор файла # 2 в то же место, что и # 1».
«Два к одному» («к» бытию >) имеет для меня более логичный смысл, чем «Два к одному», с чем я обычно путаю это. Если вы рассматриваете «и один» как одно существительное (место), это также имеет грамматический смысл в контексте, который сложнее сделать с «Два и к одному» - вам придется учитывать «к одному» один существительное, и оно все равно не имело бы контекстуального смысла.
Не мнемоника, но я читаю это следующим образом:
0это стандартный
1это стандартный вывод
2это stderr.
>в.
<вне.
&это дескриптор файла (в некоторых оболочках).
2>&1
2 > & 1
stderr into file descriptor 1
redirect stderr into stdout
Это может измениться, если вы перепутали с любым из файловых дескрипторов до перенаправления ...
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.
Когда вы пишете 2>&1, вы говорите «стандартная ошибка идет в стандартный вывод».
Давайте разберемся с этим.
Сначала вы хотите запомнить, что стандартная ошибка 2и стандартный вывод 1.
Итак, у вас есть 2что-то что-то 1.
"идет" написано >.
Итак, у вас есть 2>что-то 1.
2>filenameозначает отправить стандартную ошибку в filename. Но вы не хотите отправлять его в файл с именем 1. Вы хотите что-то еще: номер файла, который уже открыт. Вот для чего &.
Так 2>&1.
Вы также можете думать об этом, как будто вы выполняете задание, где « >равно» равно, а « &как» $, сравните:
f=$1
2>&1
Чтобы понять командную строку с несколькими перенаправлениями, важно знать, что перенаправления выполняются слева направо. См. Порядок перенаправлений для более подробной информации об этом.
Если вы понимаете, что FD2 - это STDERR, вы можете подумать: «О, и захватывать STDERR, куда бы я ни отправлял STDOUT (FD1)».
Мои коллеги и я обычно говорю «два больше , чем один», потому что большинство из нас не всегда помнить , что stderrдескриптор файла 2и stdoutявляется 1(особенно новички в Unix / Linux), так что другие мнемоники о перенаправлении stderrдействительно не работают , Единственная проблема в том, что вы все равно должны помнить, куда идет амперсанд!