Expansão e substituição parecem ser intercambiáveis no mesmo contexto na linguagem de programação shell. Por exemplo, alguns documentos, como o manual de referência do Bash , o Wiki do Bash Hackers, usam a palavra 'expansão' para explicar ' expansão de parâmetros do shell '. No entanto, alguns outros documentos parecem preferir a palavra 'substituição'. O Advanced Bash-Scripting Guide usa a substituição de parâmetro .
Existe alguma diferença entre 'expansão' e 'substituição' em termos de terminologia de programação de shell?
shell-script
terminology
MS.Kim
fonte
fonte
variable expansion
,command substitution
. Qual a sua dúvida?man sh
eman set
. E quando você tem essas coisas para baixo, faz os documentos específicos do shell.Respostas:
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 expandimosthis
, obtemosthat
. 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çãofoo 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:
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.fonte
Acho que a diferença geralmente é mínima demais para ser notada - e os termos são frequentemente usados de forma intercambiável. Embora, se você olhar para os dois casos acima, você pode ver que no primeiro exemplo nós substituto
$1
para$2
, como resultado da expansão da$2
. Assim que$2
não puder ser expandido, não haverá substituição.goldilocks faz um bom argumento sobre a existência etérea de substituições. Mais ou menos como o gato de Schrodinger, eu acho. Isso me lembrou algo. Você pode não estar familiarizado com esta forma de expansão de parâmetro especificada pelo POSIX, mas funciona de uma maneira oposta à forma acima:
Agora, às vezes, quero o mesmo comportamento, mas por um
set
valor. O POSIX não especifica esse comportamento para nada exatamente. Mas, com um truque ou dois, é simplesmente gerenciado:Mas:
fonte