Substituição é quase sinônimo de expansão neste contexto, porque seus significados se sobrepõem. Nenhuma é uma subcategoria completa da outra, embora na seção Manual do GNU você faça referência a substituições que são consideradas como parte de uma expansão geral.
Uma expansão está extraindo o valor de um identificador. Por exemplo, se this=that
, quando expandimos this
, obtemos that
. Uma expansão que não envolve substituição é predeterminada, pois o valor usado já existe e deve ser simplesmente recuperado, embora isso inclua a combinação de valores recuperados / explícitos (como na "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 foo bar
e captura de sua saída. 1 Embora o valor resultante de uma substituição possa ser completamente previsível, ele é diferente do valor recuperado em uma expansão normal, porque na verdade não existe até que a substituição ocorra - ela é produzida.
As substituições têm dois tipos, comando e processo , que são simétricos:
# 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 demais tecnicamente, o que nos leva à nota de rodapé ...
foo bar
nesse caso, pode ser uma função shell interna; nesse caso, não há IO entre processos. A existência de embutidos no shell menos obviamente oculta essa diferença. Em termos de conteúdo, a entrada e a saída serão as mesmas.
variable expansion
,command substitution
. Qual a sua dúvida?