Sostituzione è quasi sinonimo di espansione in questo contesto perché i loro significati si sovrappongono. Né è una sottocategoria abbastanza completa dell'altra, sebbene nella sezione Manuale GNU a cui fai riferimento ci sono sostituzioni che sono considerate come parte di un'espansione complessiva.
Un'espansione sta estraendo il valore di un identificatore. Ad esempio, se this=that
, quando espandiamo this
, otteniamo that
. Un'espansione che non comporta la sostituzione è predeterminata in quanto il valore utilizzato esiste già e deve essere semplicemente recuperato, sebbene ciò includa la combinazione di valori recuperati / espliciti (come con "espansione aritmetica").
Una sostituzione crea un valore come risultato di un'operazione esplicita di input / output. Ad esempio, if this=$(foo bar)
, this
è il risultato dell'esecuzione foo bar
e della cattura del suo output. 1 Sebbene il valore risultante da una sostituzione sia del tutto prevedibile, è diverso da quello recuperato in una normale espansione perché in realtà non esiste fino a quando non ha luogo la sostituzione: viene prodotto.
Le sostituzioni sono di due tipi, comando e processo , che sono in qualche modo simmetriche:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
Il "comando" nel primo è ls
, così come il "processo" nel secondo. Potremmo dire che ciò che viene sostituito è davvero la fine di una pipa. La sostituzione del processo si sovrappone al reindirizzamento . Tuttavia, questo è probabilmente un po 'troppo restrittivo tecnicamente, il che ci porta alla nota in calce ...
foo bar
in questo caso potrebbe essere una funzione di shell interna, nel qual caso non vi è alcun IO tra i processi. L'esistenza di shell incorporate meno ovviamente nasconde questa differenza. In termini di contenuto, l'input e l'output saranno gli stessi.
variable expansion
,command substitution
. Qual è il tuo dubbio?