>> 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
и удобной формы!