Por que a atribuição de variável que precede o comando é ignorada?

Por que a atribuição de variável que precede o comando é ignorada?

A página de manual do bash 4.1 afirma(enfase adicionada)...

Comandos Simples

Um comando simples éuma sequência de atribuições de variáveis ​​​​opcionais seguidas por palavras separadas por espaços em brancoe redirecionamentos, e finalizado por um operador de controle. O primeiropalavraespecifica o comando a ser executado e é passado como argumento zero. As palavras restantes são passadas como argumentos para o comando invocado.

Verificando a versão no meu sistema(NÃO corrigido para shellshock)...

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

No entanto, as atribuições de variáveis ​​anteriores, sem ponto e vírgula, deveriam ser uma maneira de localizar valores de variáveis ​​de ambiente apenas durante a invocação de um comando, mas não parecem ...

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

Solução
Poresta resposta de outra perguntaparece que o comando deve usar deliberadamente as variáveis ​​de ambiente de seu pai e echonão o faz. Mas invocações de shell como bash -cdo ...

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

Recursos

Responder1

Está linha

x=123 echo $x

é avaliado na seguinte ordem:

  1. $xé expandido para o valor de xnoatualconcha.
  2. O valor de xno ambiente do comando a ser executado é definido como 123
  3. A linha de comando expandida é procurada por um comando e echoé encontrada.
  4. echoé executado em um ambiente xdefinido como 123 e $1definido como qualquer valor xna etapa 1.
  5. echogera saída $1para a saída padrão, mas ignora os outros valores em seu ambiente.

Observe que $xum argumento é separado daquele xque precede o comando.

informação relacionada