Bash. Сравнение и отличия 2>&1 и &>

Рейтинг: 2Ответов: 1Опубликовано: 03.04.2023

Штудирую и проверяю свои "знания" в bash. Столкнулся с непониманием 2>&1 и &>

  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
  1. &> перенаправление стандартного вывода ошибок (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 и &>

Спасибо

Ответы

▲ 3

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 оказался в этом файле.