A substituição é quase sinónimo de expansão neste contexto porque os seus significados se sobrepõem. Nem uma subcategoria completa da outra, embora no Manual GNU seção que você faz referência há substituições que são consideradas como parte de uma expansão global.
Uma expansão está extraindo o valor de um identificador. Por exemplo, se this=that
, quando expandirmos this
, obteremos that
. Uma expansão que não envolva substituição é pré-determinada em que o valor usado já existe e deve ser simplesmente recuperado, embora isso inclua a combinação de valores recuperados / explícitos (como "expansão aritmética").
Uma substituição cria um valor como resultado de uma operação explícita de entrada / saída. Por exemplo, se this=$(foo bar)
, this
é o resultado da execução de foo bar
e da captura de sua saída. 1 Embora o valor resultante de uma substituição seja completamente previsível, é diferente do valor encontrado em uma expansão normal, porque na verdade não existe até a substituição ocorrer - é produzido.
As substituições vêm em dois tipos, comando e processo , que são simétricas:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
O "comando" no primeiro é ls
, assim como o "processo" no segundo. Podemos dizer que o que está sendo substituído é realmente o fim de um cano. A substituição do processo se sobrepõe ao redirecionamento . No entanto, isso é provavelmente um pouco restritivo tecnicamente, o que nos leva à nota de rodapé ...
-
foo bar
, neste caso, poderia ser uma função de shell interna, caso em que não há E / S de interprocesso. A existência de built-ins shell menos obviamente obscurece essa diferença. Em termos de conteúdo, a entrada e a saída serão as mesmas.