В этом SO-потоке и нескольких других потоках я видел следующие команды для перенаправления stdout
и stderr
в файл.
Они все эквивалентны? Есть ли разница между ними?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
shell
zsh
io-redirection
Амелио Васкес-Рейна
источник
источник
Ответы:
Так как вы пометили
zsh
, позвольте мне сказать вам, что все 3 перенаправления работают точно так же. Как вы могли прочитать в обеих дублированных сообщениях (тот , в комментариях и один в вашем посте), все они редиректstderr
наstdout
которые INTURN перенаправляется в файл «логфайл» (то есть, файл_журнал будет содержать как вывод и ошибки ).Но их поведение меняет много в зависимости от оболочки, в которой вы находитесь.
Все три стиля перенаправлений хорошо работает таким же образом , в
bash
иzsh
Но:
>&
Работает только вcsh
илиtcsh
Во
ksh
только2>&1
работает.Я ненавижу
ksh
. В то время как>&
только что выдал ошибку,&>
задний план части команды и очистить лог-файл (если не пусто).источник
sh
? Если это оболочка POSIX,&>
и>&
она не будет работать.&>
и>&
полуэквивалентность (клоббер)В
zsh
разделе «Перенаправления» сказано, что:&>
>&
эквивалентны.
И то и другое закроет файл - урежет его до 0 байтов перед записью в него, как
> file
в случае с STDIN-only.Тем не менее ,
bash
раздел «Перенаправления вручную» добавляет, что:Так что, хотя вы пометили тегами
zsh
, вероятно, хорошей практикой является получение памяти пальцем в первом классе, если кто-нибудь когда-нибудь напишетbash
скрипт.>> logfile 2>&1
и&>>
эквивалентность (приложение)Здесь
logfile
не перезаписывается, но открывается для записи в конце файла, то есть в режиме добавления (O_APPEND
).Эквивалент в обоих
{ba,z}sh
:В
bash
:(Примечание: снова рекомендуется использовать
&>
over- clobber>&
в приведенном выше разделе, поскольку есть только один способ добавленияbash
.)zsh
позволяет как&>>
и>>&
формы.источник