Expansion und Substitution scheinen in der Shell-Programmiersprache im selben Kontext austauschbar zu sein. In einigen Dokumenten wie dem Bash-Referenzhandbuch und dem Bash Hackers Wiki wird beispielsweise das Wort "Erweiterung" verwendet, um die " Erweiterung der Shell-Parameter" zu erklären . Einige andere Dokumente scheinen jedoch das Wort "Substitution" zu bevorzugen. Erweiterte Bash-Scripting Guide verwendet Parameter substituion .
Gibt es einen Unterschied zwischen "Erweiterung" und "Substitution" in Bezug auf die Terminologie der Shell-Programmierung?
shell-script
terminology
MS.Kim
quelle
quelle
variable expansion
,command substitution
. Was ist dein Zweifel?man sh
undman set
. Und wenn Sie das Zeug erledigt haben, dann machen Sie die Shell-spezifischen Dokumente.Antworten:
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 expandierenthis
, bekommen wirthat
. 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ührungfoo 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:
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.quelle
Ich denke, der Unterschied ist im Allgemeinen zu gering, um beachtet zu werden - und die Begriffe werden oft synonym verwendet. Obwohl, wenn man sich den beiden oben genannten Fälle anschaut, kann man das im ersten Beispiel sehen wir Ersatz
$1
für$2
als Folge der Expansion von$2
. Sobald$2
nicht erweitert werden kann, erfolgt keine Substitution.Goldlöckchen machen einen guten Punkt über die ätherische Existenz von Substitutionen. Ein bisschen wie Schrödingers Katze, denke ich. Es erinnerte mich an etwas. Sie sind möglicherweise nicht mit dieser Form der von POSIX angegebenen Parametererweiterung vertraut, sie funktioniert jedoch in umgekehrter Weise wie oben beschrieben:
Jetzt möchte ich manchmal das gleiche Verhalten, aber für einen
set
Wert. POSIX gibt dieses Verhalten für nichts genau an. Aber mit ein oder zwei Tricks ist es einfach gelungen:Aber:
quelle