На цьому потоці 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
дозволяє &>>
і >>&
форми, і форми.