Quando usar um ponto e vírgula entre as variáveis de ambiente e um comando

14

Alguém pode explicar por que o ponto e vírgula é necessário para que o LANG seja visto como atualizado pelo bash?

Não funciona:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

Trabalhos:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

Estou trabalhando com o bash 4.1.10 no linux e a mesma versão no cygwin

    
por Richard Corden 18.04.2012 / 12:07

2 respostas

22

Parâmetros e outros tipos de expansões são executados quando o comando é lido, antes de ser executado.

A primeira versão, LANG=Ja_JP bash -c "echo $LANG" , é um único comando. Depois que ele for analisado como tal, $LANG será expandido para en_US antes que qualquer coisa seja executada. Quando o bash terminar de processar a entrada, ela bifurcará um processo, adicionará LANG=Ja_JP ao ambiente como esperado e, em seguida, executará bash -c echo en_US .

Você pode impedir a expansão com aspas simples, ou seja, LANG=Ja_JP bash -c 'echo $LANG' outputs Ja_JP .

Observe que quando você tem uma atribuição de variável como parte de um comando, a atribuição afeta apenas o ambiente desse comando e não o do seu shell.

A segunda versão, LANG=Ja_JP; bash -c "echo $LANG" , na verdade, são dois comandos separados executados em seqüência. A primeira é uma atribuição de variável simples sem um comando, por isso afeta seu shell atual.

Assim, seus dois trechos são fundamentalmente diferentes, apesar da distinção superficial de um único ; .

Completamente fora do tópico, mas eu recomendo acrescentar um .UTF-8 ao definir LANG . Não há nenhuma boa razão hoje em dia para não usar Unicode no século 21.

    
por 18.04.2012 / 12:20
5

VAR=value; somecommand é equivalente a

VAR=value
somecommand

Estes são comandos não relacionados executados um após o outro. O primeiro comando atribui um valor à variável do shell VAR . A menos que VAR já seja uma variável de ambiente, ela não é exportada para o ambiente, ela permanece interna no shell. Uma instrução export VAR exportaria VAR para o ambiente.

VAR=value somecommand é uma sintaxe diferente. A atribuição VAR=value é para o ambiente, mas essa atribuição é feita apenas no ambiente de execução de somecommand , não para a execução subseqüente do shell.

A título de exemplo:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing
    
por 19.04.2012 / 03:08