Часть руководства bash
, применимая к вашему делу, такова:
SIMPLE COMMAND EXPANSION
When a simple command is executed, the shell performs the following expansions, assignments, and redirections, from left to right.
The words that the parser has marked as variable assignments (those preceding the command name) and redirections are saved for later processing.
The words that are not variable assignments or redirections are expanded. If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments.
Redirections are performed as described above under REDIRECTION.
The text after the = in each variable assignment undergoes tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal before being assigned to the variable.
Ваша подстановка команды $(echo "echo hi > /tmp/hi")
будет расширена в точке 2, а поскольку перенаправление >
не могло быть помечено для последующей обработки в точке 1 (, так как оно появилось только в результате подстановки команды ), это не будет выполнено в соответствии с пунктом 3.
Если перенаправления не были предварительно -обработаны перед расширениями, то что-то вроде
to='>'; echo foo $to bar
будет отображать foo
в файле bar
, а не просто отображать foo > bar
, как это делается.
Обратите внимание, что bash
отличается от других оболочек тем, что он также выполняет разделение + подстановку слова, следующего за оператором перенаправления (, и умирает с «неоднозначным перенаправлением», если оно расширяется до нескольких слов ). Например, это
var='a b'; echo > $var
выдаст ошибку в bash
вместо того, чтобы затирать файл с именем a b
(, как это делают другие оболочки ).