Odpowiedzi:
Jeśli jesteś programistą C, możesz myśleć o tym &1jak o „adresie 1”, więc 2>&1czyta „deskryptor pliku przekierowującego # 2 w to samo miejsce co # 1”.
„Dwa do jednego” („do” bytu >) ma dla mnie bardziej logiczny sens niż „Dwa do jednego”, z czym to zwykle mylę. Jeśli weźmiesz pod uwagę „i jeden” jako pojedynczy rzeczownik (miejsce), ma to również sens gramatyczny w kontekście, co jest trudniejsze w przypadku „Dwóch i jednego” - należałoby rozważyć „jednego” jednego rzeczownik i nadal nie miałoby to sensu kontekstowego.
Nie jest to mnemonik, ale czytam to w następujący sposób:
0jest standardowe.
1jest standardowe.
2jest stderr.
>interesuje się.
<jest z.
&jest deskryptorem pliku (w niektórych powłokach).
2>&1
2 > & 1
stderr into file descriptor 1
redirect stderr into stdout
Może się to zmienić, jeśli pomieszałeś z dowolnym deskryptorem pliku przed przekierowaniem ...
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.
Kiedy piszesz 2>&1, mówisz „standardowy błąd przechodzi na standardowe wyjście”.
Rozwalmy to.
Najpierw chcesz zapamiętać błąd 2standardowy i standardowe wyjście 1.
Więc masz 2coś 1.
„idzie do” jest napisane >.
Więc masz 2>coś 1.
2>filenameoznacza wysłanie standardowego błędu do filename. Ale nie chcesz wysyłać go do pliku o nazwie 1. Chcesz czegoś innego: numeru już otwartego pliku. Po to &jest.
Tak 2>&1.
Możesz również pomyśleć o tym, jakbyś wykonywał zadanie, w którym to >jest równe, a to &jest jak $, porównaj:
f=$1
2>&1
Aby zrozumieć wiersz poleceń z wieloma przekierowaniami, ważne jest, aby wiedzieć, że przekierowania są wykonywane od lewej do prawej. Aby uzyskać więcej informacji na ten temat, zobacz Kolejność przekierowań .
Jeśli zrozumiesz, że FD2 to STDERR, możesz pomyśleć: „Och, i przechwyć STDERR tam, gdzie wysyłam STDOUT (FD1)”.
Razem z moimi współpracownikami zwykle mówimy „dwa są większe niż jeden”, ponieważ większość z nas nie zawsze pamięta, że stderrjest to deskryptor pliku 2i stdoutjest 1(szczególnie nowi w Uniksie / Linuksie), więc inne mnemoniki dotyczące przekierowań stderrtak naprawdę nie działają . Jedynym problemem jest to, że wciąż musisz pamiętać, dokąd zmierza ampersand!