Bash. Сравнение и отличия 2>&1 и &>
Штудирую и проверяю свои "знания" в bash.
Столкнулся с непониманием 2>&1 и &>
2>&1перенаправление стандартного вывода ошибок (stderr) в тот же устройство вывода, что и стандартный вывод (stdout).
ls -al /etc/passwd /fake_file>output.txt 2>&1
cat output.txt
Результат
ls: невозможно получить доступ к '/fake_file': Нет такого файла или каталога
-rw-r--r-- 1 root root 2310 мар 14 22:49 /etc/passwd
&>перенаправление стандартного вывода ошибок (stderr), так стандартного вывода (stdout) в файл или устройство вывода
ls -al /etc/passwd /fake_file &> output.txt
cat output.txt
ls: невозможно получить доступ к '/fake_file': Нет такого файла
или каталога
-rw-r--r-- 1 root root 2310 мар 14 22:49 /etc/passwd
Объясните пожалуйста разницу 2>&1 и &>
Спасибо
Ответы (1 шт):
2>&1 перенаправляет stderr в stdout, при этом stdout не меняется. &>/some/file пренаправляет оба потока, и stderr и stdout, в /some/file
В обоих примерах вы перенаправили оба потока в output.txt
В первом примере вы сначала перенаправили в этот файл stdout инструкцией >output.txt, затем перенаправили stderr в stdout.
Во втором примере вы сразу перенаправили оба потока в output.txt инструкцией &>output.txt.
Обратите внимание, что в первом примере важен порядок перенаправлений
$ ls -al /etc/passwd /fake_file 2>&1 >output.txt
ls: cannot access '/fake_file': No such file or directory
$ cat output.txt
-rw-r--r-- 1 root root 1987 Jun 8 2020 /etc/passwd
В этом примере СНАЧАЛА перенаправляется stderr в stdout - на тот момент stdout был связан с консолью, поэтому сообщение об ошибке ls: cannot access '/fake_file': No such file or directory было напечатано в консоли.
stdout был перенаправлен в output.txt, поэтому вывод ls оказался в этом файле.