La substitution est presque synonyme d' expansion dans ce contexte parce que leurs significations se chevauchent. Aucune des deux n'est une sous-catégorie tout à fait complète de l'autre, bien que dans la section GNU Manual que vous mentionnez, il existe des substitutions qui sont considérées comme faisant partie d'une expansion globale.
Une expansion extrait la valeur d'un identifiant. Par exemple, si this=that
, lorsque nous nous développons, this
nous obtenons that
. Une expansion qui n'implique pas de substitution est prédéterminée en ce que la valeur utilisée existe déjà et doit simplement être récupérée, bien que cela comprenne la combinaison de valeurs récupérées / explicites (comme avec une "expansion arithmétique").
Une substitution crée une valeur à la suite d'une opération d'entrée / sortie explicite. Par exemple, si this=$(foo bar)
, this
est le résultat de l'exécution foo bar
et de la capture de sa sortie. 1 Bien que la valeur résultant d'une substitution puisse être complètement prévisible, elle est différente de celle récupérée dans une expansion normale car elle n'existe réellement que lorsque la substitution a lieu - elle est produite.
Les substitutions se présentent sous deux formes, commande et processus , qui sont en quelque sorte symétriques:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
La "commande" dans la première est ls
, tout comme le "processus" dans la seconde. On pourrait dire que ce qui est substitué est vraiment la fin d'un tuyau. La substitution de processus chevauche la redirection . Cependant, c'est probablement un peu trop restrictif techniquement, ce qui nous amène à la note de bas de page ...
foo bar
dans ce cas, il pourrait s'agir d'une fonction de shell interne, auquel cas il n'y a pas d'E / S interprocessus. L'existence de modules intégrés au shell obscurcit moins évidemment cette différence. En termes de contenu, l'entrée et la sortie seront les mêmes.
variable expansion
,command substitution
. Quel est ton doute?