Substitution ist in diesem Zusammenhang fast gleichbedeutend mit Expansion, da sich ihre Bedeutungen überschneiden. Keiner von beiden ist eine vollständige Unterkategorie des anderen, obwohl es im Abschnitt zum GNU-Handbuch, auf den Sie verweisen, Substitutionen gibt, die als Teil einer Gesamterweiterung betrachtet werden.
Eine Erweiterung extrahiert den Wert eines Bezeichners. ZB wenn this=that
, wenn wir expandieren this
, bekommen wir that
. Eine Erweiterung, die keine Substitution beinhaltet, ist insofern vorbestimmt, als der verwendete Wert bereits vorhanden ist und einfach abgerufen werden muss, obwohl dies das Kombinieren von abgerufenen / expliziten Werten umfasst (z. B. mit "arithmetischer Erweiterung").
Eine Ersetzung erzeugt einen Wert als Ergebnis einer expliziten Eingabe- / Ausgabeoperation. ZB wenn this=$(foo bar)
, this
ist das Ergebnis der Ausführung foo bar
und seine Ausgabe zu erfassen. 1 Obwohl der Wert, der sich aus einer Substitution ergibt, möglicherweise vollständig vorhersehbar ist, unterscheidet er sich von dem Wert, der bei einer normalen Erweiterung abgerufen wird, da er erst dann existiert, wenn die Substitution stattfindet - er wird erzeugt.
Substitutionen gibt es in zwei Varianten, Befehl und Prozess , die irgendwie symmetrisch sind:
# Command substitution
foo=$(ls)
# Process substitution
wc <(ls)
Der "Befehl" im ersten ist ls
, ebenso wie der "Prozess" im zweiten. Wir könnten sagen, was ersetzt wird, ist wirklich das Ende einer Pfeife. Die Prozessersetzung überschneidet sich mit der Umleitung . Dies ist jedoch wahrscheinlich technisch etwas zu restriktiv, was uns zur Fußnote bringt ...
foo bar
In diesem Fall kann es sich um eine interne Shell-Funktion handeln. In diesem Fall gibt es keine Interprozess-E / A. Die Existenz von Shell-Einbauten verdeckt diesen Unterschied weniger offensichtlich. Inhaltlich sind Eingabe und Ausgabe gleich.
variable expansion
,command substitution
. Was ist dein Zweifel?