Відповіді:
Якщо ви програміст на C, ви можете вважати його &1"адресою 1", тому 2>&1"дескриптор файлу переадресації №2 " читає на те саме місце, що і №1 ".
"Два до одного" ("до" буття >) має для мене більш логічний сенс, ніж "Два і один", саме з цим я зазвичай можу плутати. Якщо ви розглядаєте "і один" як один іменник (місце), це також має граматичний сенс у контексті, що складніше зробити з "двома та одним" - вам доведеться вважати "одним" одним іменник, і це все одно не мало б контекстного сенсу.
Не мнемонічний, але я читав так:
0є stdin.
1є stdout.
2важче.
>входить.
<є поза.
&це дескриптор файлів (у деяких оболонках).
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насправді не працюють. . Проблема лише в тому, що вам залишається пам'ятати, куди йде амперсанд!