На цьому потоці 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яку вкладення переспрямовується на файл 'logfile' (тобто журнал буде містити як вихід, так і помилки ).
Але їх поведінка змінюється ЛОТОм залежно від оболонки, в якій ви знаходитесь.
Усі три стилі переадресації добре працюють однаково в 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.
Однак у bashрозділі "Перенаправлення вручну" додається, що:
З двох форм перша є кращою. Це семантично рівнозначно
>word 2>&1При використанні другої форми слово може не розширюватися на число або
-. Якщо це так, інші оператори перенаправлення застосовують (див. Копіювання файлів Дескриптори нижче) з міркувань сумісності.
Тож, хоча ви позначені тегами zsh, це, мабуть, хороша практика отримати пальцеву пам’ять у першій формі, якщо коли-небудь слід писати bashсценарій.
>> logfile 2>&1та &>>еквівалентність (додаток)Тут logfileне перезаписується, а відкривається для запису в кінці файлу, тобто в режимі додавання ( O_APPEND).
Еквівалент в обох {ba,z}sh:
command1 &>> logfile
В bash:
Формат додавання стандартного виводу та стандартної помилки:
&>>wordЦе семантично рівнозначно
>>word 2>&1(див. Копіювання дескрипторів файлів нижче).
(Примітка: використання ганчірки з &>більш ніж >&в попередньому розділі знову рекомендується дано є тільки один спосіб для додавання в bash.)
zshдозволяє &>>і >>&форми, і форми.