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