Em qualquer shell POSIX, quando você escreve
X=123 echo $X
o $X
é expandido antes de todo o comando ser executado, ou seja, se $X
estiver inicialmente não definido, você verá:
X=123 echo
que é então executado. Você pode ver mais ou menos o que o shell está fazendo com set -x
:
$ set -x
$ X=123 echo X=$X
+ X=123
+ echo X=
X=
$ set +x
Você pode ver que echo
(na verdade, o próprio shell, que faz a expansão antes de executar echo
) ainda tem acesso ao ambiente:
$ X=123 eval 'echo $X'
123
O problema com cat <<EOF
é semelhante. Note que em relação a bash
, havia um bug em versões antigas (anteriores a 4.1), descritas no arquivo CHANGES
como:
Fixed a bug that caused variable expansion in here documents to look in any temporary environment.
Esta pode ser a causa do comportamento observado no Mac OS X. Não confie neste bug.