it-swarm.com.de

Was ist Befehlssubstitution in einer Shell?

Ich benutze Ubuntu 16.04 mit Bash und habe versucht, in Wikipedia , in hier und in hier zu lesen, aber ich habe die Bedeutung nicht verstanden der "Befehlssubstitution" in Shell-Scripting im Allgemeinen und in Bash im Besonderen, wie in:

$(command)

oder

`command`

Was bedeutet dieser Begriff?

Bearbeiten: Als ich diese Frage zum ersten Mal veröffentlichte, kannte ich bereits das reine Konzept der Substitution und auch das Linux-Konzept von Variablensubstitution (Ersetzen einer Variablen durch ihren Wert durch Ausführung), aber ich habe den Zweck dieser Frage immer noch verfehlt Shell-Funktion aus der Dokumentation aus irgendeinem Grund oder einer Gruppe von Gründen.


Meine Antwort nach Frage gesperrt

Die Befehlssubstitution ist eine Operation mit dedizierter Syntax, mit der sowohl ein Befehl ausgeführt als auch die Ausgabe dieses Befehls von einer Variablen zur späteren Verwendung gehalten (gespeichert) wird.

Ein Beispiel mit date:

thedate="$(date)"

Wir können das Ergebnis dann mit dem Befehl printf drucken:

printf 'The date is %s\n' "$thedate"
  1. Die Syntax für die Befehlssubstitution lautet $().
  2. Der Befehl selbst lautet date.
  3. Wenn wir beide kombinieren, erhalten wir $(date), sein Wert ist das Ergebnis der Substitution (die wir nach Ausführung erhalten könnten).
  4. Wir speichern diesen Wert in einer Variablen $thedate Zur späteren Verwendung.
  5. Wir zeigen den Ausgabewert der Variablen mit printf gemäß dem obigen Befehl an.

Hinweis: \n In printf ist ein Zeilenumbruch.

6
user9303970

"Befehlsersetzung" ist der Name der Funktion der Shell-Sprache, mit der Sie einen Befehl ausführen und die Ausgabe dieses Befehls den Text des Befehls ersetzen (ersetzen) lassen können.

Es gibt keine andere Funktion der Shell-Sprache, mit der Sie dies tun können.

Eine Befehlssubstitution, d. H. Der gesamte $(...) Ausdruck, wird durch seine Ausgabe ersetzt , was die primäre Verwendung von Befehlssubstitutionen ist.

Der Befehl, den die Befehlssubstitution ausführt, wird in einer Subshell ausgeführt. Dies bedeutet, dass er über eine eigene Umgebung verfügt, die die Umgebung der übergeordneten Shell nicht beeinflusst.

Nicht alle Subshell-Ausführungen sind Befehlsersetzungen (siehe weitere Beispiele am Ende).

Beispiel, das zeigt, dass eine Befehlssubstitution in einer Subshell ausgeführt wird:

$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123

Hier wird die Variable s auf den String 123 Gesetzt. In der nächsten Zeile wird echo für eine Zeichenfolge aufgerufen, die das Ergebnis einer Befehlsersetzung enthält. Die Befehlssubstitution setzt s auf die Zeichenfolge world und gibt diese Zeichenfolge wieder. Die Zeichenfolge world ist die Ausgabe des Befehls in der Befehlssubstitution und somit, wenn dies unter set -x Ausgeführt wurde. würden wir sehen, dass die zweite Zeile oben auf echo 'hello world' erweitert worden wäre, was hello world auf dem Terminal erzeugt:

$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world

(bash fügt jeder Ebene einer Befehlsersetzungs-Subshell in der Trace-Ausgabe eine zusätzliche Ebene von + - Eingabeaufforderungen hinzu. Andere Shells tun dies möglicherweise nicht.)

Zuletzt zeigen wir, dass der Befehl innerhalb der Befehlssubstitution in einer eigenen Subshell ausgeführt wurde, da er den Wert von s in der aufrufenden Shell nicht beeinflusst hat (der Wert von s ist immer noch 123, Nicht world).

Es gibt andere Situationen, in denen Befehle in Unterschalen ausgeführt werden, z

echo 'hello' | read message

In bash wird read in einer Subshell ausgeführt, was bedeutet, dass $message In der übergeordneten Shell nicht geändert wird, dh echo "$message" Nach dem oben Gesagten Der Befehl gibt eine leere Zeichenfolge aus (oder einen beliebigen Wert $message zuvor).

Eine Prozessersetzung in bash wird auch in einer Subshell ausgeführt:

cat < <( echo 'hello world' )

Auch dies unterscheidet sich von einer Befehlsersetzung.

14
Kusalananda
a=$(command)

speichert den Ergebniswert von command in der Variablen.

Da ist wirklich nichts mehr dran.

Als Randnotiz glaube ich:

a=`command`

wurde veraltet und hat die gleiche Bedeutung wie oben.

0