Різниці перенаправлення між &>> & та 2> & 1


12

На цьому потоці SO та кількох інших потоках я побачив наступні команди для переадресації stdoutта stderrфайлу.

Чи всі вони рівноцінні? Чи є різниця між ними?

command1 >> logfile 2>&1
command &> logfile
command >& logfile

1
Останні два є equivilent: stackoverflow.com/q/11255447/1032785
jordanm

Відповіді:


7

Оскільки ви позначили тегом 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. Хоча >&якраз і видав помилку, &>фонову частину команди та випорожнив лог-файл (якщо він не порожній).


1
Що ти мав на увазі sh? Якщо це POSIX оболонки, &>і >&не працюватиме.
cuonglm

На жаль, перше твердження фактично невірно. Дивіться мою відповідь на клобер проти додавання.
Том Хейл

1

&>і >&пів-еквівалентність (колошматити)

У 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дозволяє &>>і >>&форми, і форми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.