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.