Що означає> & означає?


81

Я був трохи розгублений цим виразом:

gcc -c -g program.c >& compiler.txt

Я знаю &>filename, що перенаправить stdout і stderr у файл filename. Але в цьому випадку амперсанд після знаку більше. Це схоже на форму M>&N, де Mі Nє дескрипторами файлів.

У наведеному вище фрагменті коду, робить M=1і N='compiler.txt'? Чим саме це відрізняється від:

gcc -c -g program.c > compiler.txt     (ampersand removed)

Я розумію, що кожен відкритий файл пов’язаний з дескриптором файлу більше 2. Чи правильно це?

Якщо так, чи є ім’я файлу взаємозамінним із його дескриптором файлу як ціллю переспрямування?

Відповіді:


93

Це те саме, що &>. З керівництва bash:

Перенаправлення стандартного виводу та стандартної помилки Ця конструкція дозволяє перенаправляти як стандартний вивід (дескриптор файлу 1), так і стандартний вивід помилки (дескриптор файлу 2) у файл, ім'я якого є розширенням слова.

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1

7
Я почуваюся нерозумно. Я витратив купу часу на читання інших джерел, і це було саме там, на сторінці.
протилежний

3
>&- це синтаксис, який використовується csh та tcsh для перенаправлення як stdout, так і stderr. Тому, мабуть, bash це приймає.
Кіт Томпсон,

4
Чи означає це, що &>wordі >word 2>&1є семантично еквівалентними? Прецедент "Цього" мені не зрозумілий.
geneorama

8
@geneorama &>word, >word 2>&1, і >&word точно так же.
jordanm

1
Тепер я усвідомлюю, що раніше зробив помилку на основі прочитаного в інших місцях. >лише переспрямовує стандартний вихід. >не переспрямовує помилку. (Мені, мабуть, слід перенаправити свої майбутні коментарі на /dev/null)
geneorama

8

&>vs >&: краща версія &>(clobber)

Щодо:

  • &>
  • >&

обидва будуть клобувати файл - усікають його до 0 байт, перш ніж писати до нього, як це > fileбуло б зроблено у випадку лише STDIN.

Однак розділ bashручного перенаправлення додає, що:

З двох форм переважною є перша. Це семантично еквівалентно

>word 2>&1

При використанні другої форми слово може не розширюватися до числа або -. Якщо це відбувається, застосовуються інші оператори перенаправлення (див. Розділ Дублювання дескрипторів файлів нижче) з міркувань сумісності.

(Примітка: в zshобох еквівалентні .)

Дуже хороша практика отримувати пам’ять пальців у першій ( &>) формі, оскільки:

Використовувати &>>як >>&не передбачено bash(додати)

Існує лише одна форма додавання:

Формат додавання стандартного виводу та стандартної помилки:

&>>word

Це семантично еквівалентно

>>word 2>&1

(див. розділ Дублювання дескрипторів файлів нижче).

Примітка:

  • Використання ганчірки з &>більш ніж >&в попередньому розділі знову рекомендується дано є тільки один спосіб для додавання вbash .
  • zshдопускає як &>>і >>&форми.

Ця відповідь набагато корисніша, ніж прихильна.
вбивця

так це &спеціальний символ, який перетворювач інтерпретатора оболонки перетворює на 1 і 2?
Fakher Mokadem

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