Uma pergunta semelhante foi respondida recentemente : os símbolos são avaliados na linha antes de o símbolo ser definido nesta linha, tornando necessário dividir a definição e o uso dos símbolos em linhas separadas.
Solicitado por um comentário, você poderia ter feito isso:
foo=bar bash -c 'echo $foo'
que primeiro atribui um valor a foo
e passa isso para um novo processo como uma variável de ambiente onde ele pode ser impresso.
Você pode ler mais sobre isso em POSIX Shell Command Language Reconhecimento de tokens .
Acompanhamento do @mikeserv comentário:
- POSIX não é explícito o suficiente para dar a resposta completa.
- No início da seção citada, diz
The shell shall read its input in terms of lines from a file, from a terminal in the case of an interactive shell, or from a string in the case of sh -c or system().
- no final, diz
Once a token is delimited, it is categorized as required by the grammar in Shell Grammar.
- mas o POSIX não diz explicitamente que toda a linha é tokenizada antes de trabalhar na gramática.
- nesse caso, confiamos na prática existente - o shell está em conformidade porque nada contradiz o padrão escrito, mas o padrão não pode ser usado para prever o comportamento em todos os casos.
- o mesmo comentário se aplica, é claro, ao comportamento dos aliases (é por isso que eu me referi a ele como uma pergunta similar ).