É um método bash específico para chamar um script: VARIABLE = valor bash somescript

2

Eu tenho trabalhado toda a minha vida em HPUX / ksh shell, então bash estes dias parece estar lançando novas maneiras de fazer muitas coisas (muitas das quais não parecem ser compatíveis com POSIX - por exemplo 'mkdir -p / root / {abc, def, ghi, jkl} '- aparentemente essa é uma das melhores práticas de diretrizes de codificação em bash / OpenStack - mas isso é um discurso completamente diferente).

De qualquer forma, tenho visto esse tipo de execução de script em vários lugares no código do OpenStack:

ENABLE_VCENTER=true bash /root/stack_install.sh

Alguém pode explicar como isso funciona? Eu sei que o shell irá definir a variável e invocar o script de shell (que é a explicação do erro nooB clássico por que a atribuição de variável não deve ser com espaços - por exemplo. HELLO = mundo ). Mas o que exatamente acontece internamente?

Além disso, por que não parece funcionar para mim quando eu tento este comando:

HELLO=world echo $HELLO

Eu recebo a seguinte saída do shell:

[ ubuntuOne : /home/bumblebee ]
> HELLO=world echo $HELLO


[ ubuntuOne : /home/bumblebee ]
> 

O que estou perdendo aqui?

Obrigado pelas suas respostas.

    
por Lakshminarayanan K. 01.08.2014 / 08:07

1 resposta

2

HELLO=world echo $HELLO

Acima, bash faz a expansão do parâmetro antes que a instrução seja executada. Isso significa que $HELLO é substituído por nada (ou qualquer que seja o valor atual de HELLO) antes de a instrução ser executada (o que incluiria a configuração de HELLO como world ).

Observe:

$ HELLO=world bash -c 'echo $HELLO'
world

Observe que echo $HELLO está entre aspas simples. Aspas simples impedem a expansão dos parâmetros. Isso significa que o HELLO não é avaliado até que a subcamada bash seja iniciada e o veja como um argumento. Nesse momento, o HELLO terá sido definido como world .

Por outro lado, considere esta linha na qual as aspas simples foram substituídas por aspas duplas:

$ HELLO=world bash -c "echo $HELLO"

Aqui nada é impresso porque as aspas duplas não suprimem a expansão dos parâmetros. Assim, o comando bash recebe dois argumentos -c e echo . Portanto, nada imprime.

Todos os detalhes sangrentos

man bash explica, em detalhes, o que acontece quando comandos como os acima são processados:

When a simple command is executed, the shell performs the following expansions, assignments, and redirections, from left to right.

   1.     The words that  the  parser  has  marked  as  variable
          assignments  (those  preceding  the  command name) and
          redirections are saved for later processing.

   2.     The words that are not variable assignments  or  redi‐
          rections  are  expanded.   If  any  words remain after
          expansion, the first word is taken to be the  name  of
          the command and the remaining words are the arguments.

   3.     Redirections  are  performed  as described above under
          REDIRECTION.

   4.     The text after  the  =  in  each  variable  assignment
          undergoes  tilde  expansion, parameter expansion, com‐
          mand substitution,  arithmetic  expansion,  and  quote
          removal before being assigned to the variable.

Considere novamente o comando:

HELLO=world echo $HELLO

O argumento para echo sofre expansão de parâmetro na etapa 2, enquanto bash nem mesmo começa a atribuir o novo valor a HELLO até a etapa 4.

    
por 01.08.2014 / 08:31