В этом SO-потоке и нескольких других потоках я видел следующие команды для перенаправления stdout
и stderr
в файл.
Они все эквивалентны? Есть ли разница между ними?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
В этом SO-потоке и нескольких других потоках я видел следующие команды для перенаправления stdout
и stderr
в файл.
Они все эквивалентны? Есть ли разница между ними?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
Ответы:
Так как вы пометили 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
. В то время как >&
только что выдал ошибку, &>
задний план части команды и очистить лог-файл (если не пусто).
sh
? Если это оболочка POSIX, &>
и >&
она не будет работать.
&>
и >&
полуэквивалентность (клоббер)В 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
позволяет как &>>
и >>&
формы.