'env foo = bar echo $ foo' não imprime nada

7

Eu acho que estou tendo um enorme brainfart. Eu esperaria

env foo=bar echo $foo

... para imprimir bar , mas recebo uma linha vazia. Wat.

O mesmo acontece se eu usar a sintaxe bash:

foo=bar echo $foo
    
por badp 09.11.2015 / 10:41

1 resposta

8

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 ).
por 09.11.2015 / 10:49