É uma questão da ordem em que as diferentes etapas de avaliação de um comando acontecem.
A=10 echo $A
primeiro analisa o comando em um comando simples composto de três palavras A=10
, echo
e $A
. Então cada palavra sofre uma substituição variável, isto é, a transformação de expansões variáveis como $A
em seus valores (estou omitindo etapas que não fazem nada visível).
Se A
tiver o valor foo
inicialmente, o resultado das etapas de expansão será um comando simples que ainda tem três palavras: A=10
, echo
e foo
. (O shell também lembra neste ponto quais caracteres estavam inicialmente entre aspas - neste caso, nenhum.) O próximo passo é executar o comando. Como A=10
começa com um nome de variável válido seguido por um sinal de igual, ele é tratado como uma atribuição; a variável A
está definida como 10
no shell e no ambiente durante a execução do comando. (Normalmente você precisa escrever export A
para ter A
no ambiente e não apenas como uma variável shell; isso é uma exceção.) A próxima palavra não é uma atribuição, então é tratada como um nome de comando -no comando). O comando echo
não depende de nenhuma variável, portanto A=10 echo $A
tem exatamente o mesmo efeito que echo $A
.
Se você quiser definir uma variável apenas para a duração de um comando, mas levando a atribuição em consideração enquanto executa o comando, você pode usar um subshell. Um subshell, indicado por parênteses, faz com que todas as mudanças de estado (atribuições de variáveis, diretório atual, definições de funções, etc.) sejam locais para o subshell.
(A=10; echo $A)
Faça esse export A=10
se você quiser exportar a variável para o ambiente para que ela seja vista por programas externos.