Por que o comando precedente de atribuição de variável é ignorado? [duplicado]

1

O bash 4.1 manpage states (ênfase adicionada) ...

Simple Commands

A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.

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

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

No entanto, atribuições de variáveis precedentes, sem ponto-e-vírgula, devem ser uma maneira de localizar valores de variáveis de ambiente para a vida de apenas uma chamada de 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
Por esta resposta de outra pergunta , parece que o comando deve deliberadamente usar as variáveis de ambiente de seu pai e echo não. Mas invocações de shell como bash -c do ...

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

Recursos

por DocSalvager 09.10.2014 / 13:58

1 resposta

3

Esta linha

x=123 echo $x

é avaliado na seguinte ordem:

  1. $x é expandido para o valor de x no shell atual .
  2. O valor de x no ambiente do comando a ser executado é definido como 123
  3. A linha de comando expandida é pesquisada por um comando e echo é encontrado.
  4. echo é executado em um ambiente em que x está definido como 123 e $1 está definido como  seja qual for o valor x no passo 1.
  5. echo outputs $1 para a saída padrão, mas ignora os outros valores  em seu ambiente.

Observe que $x como um argumento é separado do x que precede o comando.

    
por 09.10.2014 / 14:45