Expansão de til, expansão de parâmetro, substituição de comando e expansão aritmética são listadas na mesma etapa. Isso significa que eles são executados ao mesmo tempo . O resultado da expansão de til não sofre expansão de parâmetro, o resultado da expansão de parâmetro não sofre expansão de til e assim por diante. Por exemplo, se o valor de foo
for $(bar) qux
, a palavra $foo
será expandida para $(bar) qux
na etapa 1; o texto resultante da expansão do parâmetro não está sujeito a nenhuma transformação adicional na etapa 1, mas é dividido na etapa 2.
"Começando até o final" significa processamento da esquerda para a direita, o que importa, por exemplo, quando atribuições ocorrem: a=1; echo $a$((a=2))$a
imprime 122
, porque é executada a expansão aritmética de $((a=2))
, definindo a
para 2, entre a expansão de parâmetro do primeiro $a
e a expansão de parâmetro do segundo $a
.
O motivo do pedido é o uso histórico. POSIX geralmente segue a implementação existente, raramente especifica novo comportamento. Existem várias conchas ao redor; na maior parte, POSIX segue o shell Korn , mas omite a maioria dos recursos que não estão presentes no Bourne shell (como o shell Bourne é largamente abandonado, a próxima versão do POSIX provavelmente incluirá novos recursos do ksh).
A razão pela qual o shell Bourne executou a expansão de parâmetro e a divisão de campo e globbing é que ele permitiu que um glob fosse armazenado em uma variável: você pode definir a
to *.txt *.pdf
e usar $a
para representar o lista de nomes de arquivos correspondentes a *.txt
seguido pela lista de nomes correspondentes a *.pdf
(assumindo que ambos os padrões correspondam). (Não estou dizendo que esse é o melhor design possível, apenas que ele foi projetado dessa maneira.) É menos claro para mim por que alguém desejaria que a substituição de comando fosse colocada em uma etapa específica na shell Bourne; no shell Korn, sua sintaxe $(…)
está próxima da expansão do parâmetro ${…}
, portanto, faz sentido realizá-las em conjunto.
A colocação da expansão do til é uma esquisitice histórica. Teria mais sentido colocá-lo posteriormente, para que você pudesse escrever ~$some_user
e expandi-lo para o diretório inicial do usuário cujo nome é o valor da variável some_user
. Eu não sei porque não foi feito dessa maneira. Esse pedido exige até mesmo uma declaração especial de que o resultado da expansão do til não passa por outras expansões (passando pela passagem citada, se HOME
for /foo bar
, então ~
expandiria para as duas palavras /foo
e bar
devido à divisão do campo, mas nenhum shell faz isso e o POSIX.2008 declara explicitamente que “o nome do caminho resultante da expansão do til deve ser tratado como se fosse citado”).
Não há expansão de chave no POSIX, caso contrário, a especificação a declararia.
A expans� do Word �realizada apenas em WORDs e com ressalvas mencionadas nas sec�es seguintes (por exemplo, a separa�o de campos e gera�o de caminhos apenas s� executadas em contextos que permitem m�tiplas palavras, e. g., entre aspas duplas). NAMEs, NEWLINEs, IO_NUMBERs e assim por diante não contêm nada que possa ser expandido de qualquer maneira.