>> file command
Означает ли это, что весь стандартный stdout перенаправлен, а не только из команды?
Такое перенаправление влияет на простую команду. От man 1 bash:
Перед выполнением команды ее ввод и вывод могут быть перенаправлены с использованием специальных обозначений, интерпретируемых оболочкой. […] Следующие операторы перенаправления могут предшествовать или появляться в любом месте простой команды или могут следовать за командой. Перенаправления обрабатываются в порядке их появления слева направо.
"Следующими операторами перенаправления" являются [n]<word , [n]>word , [n]>>word и т.д.
Простая команда представляет собой последовательность необязательных назначений переменных, за которыми следуют слова и перенаправления, разделенные пробелами, и завершаются оператором управления.
А также
управляющий оператор
Токен, выполняющий функцию управления. Это один из следующих символов:
|| & && ; ;; ( ) | |& <newline>
Это означает, что следующие команды эквивалентны:
echo Some text >> file
echo Some >> file text
echo >> file Some text
>> file echo Some text
Вопрос помечен как bash, и я цитирую man 1 bash но приведенные выше команды также работают и в sh .
Синтаксический анализатор командной строки должен "обслужить" все перенаправления, прежде чем он выполнит команду (то есть команда, лишенная этих перенаправлений). Подумайте об этом, процедура одна и та же, независимо от того, где находится конкретное перенаправление. Нет причин требовать, чтобы это было в самом конце.
Когда и почему вы бы поменяли порядок?
Я не припоминаю ситуацию, когда я хотел иметь перенаправление в середине. Однако существует случай использования, когда перенаправление ввода в начале довольно полезно. Рассмотрим этот код:
grep foo file | tail | …
Представьте, что труба очень длинная. Он размещен на Super User и решает некоторые проблемы. Вы можете вставить его в консоль и запустить. Что если вы захотите добавить его к какой-либо команде или каналу? Например, вы хотите получить:
my_custom_command | grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ this is the part you'd be happy to paste
Вам необходимо удалить file из скопированной команды. По этой причине некоторые пользователи предпочитают публиковать такие команды:
cat file | grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
# ^^^^^^^^^^^^^^^^^^^^^ or even this
В других обстоятельствах это было бы совершенно бесполезным использованием cat . Некоторые скажут, что так и есть, независимо от обстоятельств. Как насчет:
< file grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
Нет cat и удобной формы!