В этом 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позволяет как &>>и >>&формы.