Различия в перенаправлении между &>> & и 2> & 1

12

В этом SO-потоке и нескольких других потоках я видел следующие команды для перенаправления stdoutи stderrв файл.

Они все эквивалентны? Есть ли разница между ними?

command1 >> logfile 2>&1
command &> logfile
command >& logfile
Амелио Васкес-Рейна
источник
1
Последние два эквивалентны: stackoverflow.com/q/11255447/1032785
Иордания

Ответы:

7

Так как вы пометили zsh, позвольте мне сказать вам, что все 3 перенаправления работают точно так же. Как вы могли прочитать в обеих дублированных сообщениях (тот , в комментариях и один в вашем посте), все они редирект stderrна stdoutкоторые INTURN перенаправляется в файл «логфайл» (то есть, файл_журнал будет содержать как вывод и ошибки ).

Но их поведение меняет много в зависимости от оболочки, в которой вы находитесь.

Все три стиля перенаправлений хорошо работает таким же образом , в bashиzsh

Но:

>&Работает только в cshилиtcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

Во kshтолько 2>&1работает.

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

Я ненавижу ksh. В то время как >&только что выдал ошибку, &>задний план части команды и очистить лог-файл (если не пусто).

Sree
источник
1
Что ты имел ввиду sh? Если это оболочка POSIX, &>и >&она не будет работать.
cuonglm
К сожалению, первое утверждение на самом деле неверно. Смотрите мой ответ для clobber vs append.
Том Хейл
1

&>и >&полуэквивалентность (клоббер)

В zshразделе «Перенаправления» сказано, что:

  • &>
  • >&

эквивалентны.

И то и другое закроет файл - урежет его до 0 байтов перед записью в него, как > fileв случае с STDIN-only.

Тем не менее , bashраздел «Перенаправления вручную» добавляет, что:

Из двух форм первая является предпочтительной. Это семантически эквивалентно

>word 2>&1

При использовании второй формы слово может не расширяться до числа или -. Если это так, применяются другие операторы перенаправления (см. Дублирование файловых дескрипторов ниже) по причинам совместимости.

Так что, хотя вы пометили тегами zsh, вероятно, хорошей практикой является получение памяти пальцем в первом классе, если кто-нибудь когда-нибудь напишет bashскрипт.

>> logfile 2>&1и &>>эквивалентность (приложение)

Здесь logfileне перезаписывается, но открывается для записи в конце файла, то есть в режиме добавления ( O_APPEND).

Эквивалент в обоих {ba,z}sh:

command1 &>> logfile

В bash:

Формат для добавления стандартного вывода и стандартной ошибки:

&>>word

Это семантически эквивалентно

>>word 2>&1

(см. Дублирование файловых дескрипторов ниже).

(Примечание: снова рекомендуется использовать &>over- clobber >&в приведенном выше разделе, поскольку есть только один способ добавления bash.)

zshпозволяет как &>>и >>&формы.

Том Хейл
источник