Comportamento inesperado no Bash

7

De man bash :

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.

Então, é perfeitamente legal escrever:

foo=bar echo $foo

mas não funciona como esperado (imprime apenas uma nova linha). É muito estranho para mim desde:

$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]

Alguém poderia me explicar onde estou fazendo errado?

    
por cYrus 25.10.2010 / 20:54

4 respostas

6

Isso acontece porque a expansão de variáveis é feita antes que o comando seja executado. No momento em que a expansão de variável ocorre, foo não está definido, portanto, ele é expandido para a sequência vazia. O comando então é executado, configurando foo .

    
por 25.10.2010 / 21:03
1

Se você estiver fazendo foo=bar e echo $foo em uma linha, isso não funcionará. Você terá que fazer uma das três coisas.

  1. Execute-os como comandos separados. ou seja: foo=bar Digite echo $foo

  2. Execute-os em uma linha, mas com um ponto-e-vírgula entre os dois. ou seja: foo=bar; echo $foo

  3. O mesmo que o número 2, mas com dois eus comerciais. ou seja: foo=bar && echo $foo

A diferença entre 2 e 3 é que 3 só executará echo $foo se foo=bar tiver êxito.

    
por 25.10.2010 / 21:06
0

Tente:

foo=bar; echo $foo
       ^

Preste atenção no ; , já que você está tentando encaixar dois comandos separados em uma única linha. Eles não trabalham juntos por padrão.

    
por 25.10.2010 / 21:05
0

Uma maneira correta de fazer isso seria:

foo=bar sh -c 'echo $foo'
    
por 27.10.2013 / 10:32