Я вполне уверен, что оценка $a
выполняется текущей оболочкой, до перенаправление настроено для echo
подоболочки?
Кажетсяподтверждается тем фактом, что echo
на самом деле вообще не записывает в файл , , что можно увидеть, если вы удалили файл log
перед второй попыткой:
[pax ~]$ echo b c >>& log
[pax ~]$ cat log
b c
[pax ~]$ rm log
[pax ~]$ echo $a b c >> & log
a: Undefined variable.
[pax ~]$ cat log
cat: log: No such file or directory
А также тот факт, что, если вы запустите echo
в явном подоболочке с перенаправлением, выполненным для подоболочки, а не echo
, вы получите желаемый результат:
[pax ~]$ ( echo $a b c ) >> & log
[pax ~]$ cat log
b c
a: Undefined variable.
На самом деле, вы можете увидеть это даже без использования правильной команды:
[pax ~]$ rm log
[pax ~]$ $xyzzy
xyzzy: Undefined variable.
[pax ~]$ $xyzzy >>&log
xyzzy: Undefined variable.
[pax ~]$ cat log
cat: log: No such file or directory
Причина этого в том, что текущая оболочка жалуется на попытку оценить $xyzzy
.Это имеет смысл.С помощью команды:
someCmd $HOME
исполняемый файл someCmd
будет никогда видеть литерал $HOME
, он фактически заменяется значением.И эта замена выполняется оболочкой до того, как someCmd
будет даже настроен (включая изменение его стандартных входных или выходных потоков).