L'expansion et la substitution semblent être interchangeables dans le même contexte dans le langage de programmation shell. Par exemple, certains documents tels que le manuel de référence Bash , Bash Hackers Wiki utilisent le mot «expansion» pour expliquer « expansion des paramètres du shell ». Cependant, certains autres documents semblent préférer le mot «substitution». Le Guide avancé de Bash-Scripting utilise la substitution de paramètres .
Existe-t-il une différence entre «expansion» et «substitution» en termes de terminologie de programmation shell?
shell-script
terminology
MS.Kim
la source
la source
variable expansion
,command substitution
. Quel est ton doute?man sh
etman set
. Et quand vous avez ces informations, vous faites les documents spécifiques au shell.Réponses:
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 obtenonsthat
. 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écutionfoo 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:
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.la source
Je pense que la différence est généralement trop minime pour être digne de mention - et les termes sont souvent utilisés de manière interchangeable. Cependant, si vous regardez les deux cas ci-dessus, vous pouvez voir que dans le premier exemple, nous nous substituons
$1
à$2
la suite de l' expansion de$2
. Dès qu'il$2
ne peut être étendu, il n'y a pas de substitution.goldilocks fait un bon point sur l'existence éthérée des substitutions. Un peu comme le chat de Schrodinger, je suppose. Cela m'a rappelé quelque chose. Vous ne connaissez peut-être pas cette forme d'extension de paramètres spécifiée par POSIX, mais elle fonctionne d'une manière opposée à la forme ci-dessus:
Maintenant, parfois, je veux le même comportement mais pour une
set
valeur. POSIX ne spécifie pas exactement ce comportement. Mais, avec une ou deux astuces, c'est simplement géré:Mais:
la source