Ich lese ein Linux-Shell-Skriptbuch und habe die folgende Warnung gefunden:
"Durch die Befehlssubstitution wird eine sogenannte Subshell zum Ausführen des eingeschlossenen Befehls erstellt. Eine Subshell ist eine separate untergeordnete Shell, die von der Shell generiert wird, in der das Skript ausgeführt wird. Aus diesem Grund stehen dem Subshell-Befehl keine Variablen zur Verfügung, die Sie im Skript erstellen."
Ich habe versucht, eine Variable in der CLI meiner aktuellen Bash-Shell zu erstellen und dann die Subshell einzugeben, um zu überprüfen, ob ich sie auf dem Bildschirm drucken kann. Also ja, ich kann es nicht tun, scheint dem obigen Zitat zu entsprechen. Ich habe jedoch das folgende Skript mit Befehlsersetzung ausgeführt:
#!/bin/bash
var=5.5555
ans=$(echo $var)
echo $ans
Und das Ergebnis ist:
5.5555
Wie ich verstanden habe, sollte der Wert von var nicht gedruckt werden, da die Subshell nicht in der Lage sein sollte, ihn zu "sehen". Warum passiert das?
Antworten:
Die Aussage:
ist falsch. Der Bereich einer in der übergeordneten Shell definierten Variablen ist das gesamte Skript (einschließlich der mit Befehlsersetzung erstellten Subshells).
Laufen:
wird das Ergebnis geben:
$var
wird durch die Unterschale aufgelöst:Siehe auch das Beispiel 21-2 .
quelle
Die angegebene Aussage ist nicht wahr. Es ist auch nicht wahr, dass die Variable vor dem Ausführen der Subshell vorab ersetzt wurde.
Sie können dies direkt mithilfe der variablen Indirektion überprüfen :
Die Variable
x
ist definitiv direkt für die Subshell verfügbar (anstatt ihren Wert zuvor erweitert zu haben), da sie${!y}
von der Variablen liest, in der der Name gespeichert isty
- die zum Zeitpunkt der Erstellung der Subshell nicht vorhanden war.Eine gemeinnützige Lektüre der Passage aus dem Buch wäre, dass die "Variable" nicht verfügbar ist, weil Sie ihren Wert nicht dauerhaft ändern können. Alle Variablenzuweisungen, die Sie innerhalb einer Subshell vornehmen, stehen der übergeordneten Shell anschließend nicht mehr zur Verfügung, unabhängig davon, ob neue Variablen (wie
y
) erstellt oder vorhandenen Variablen Ersatzwerte zugewiesen werden . Wenn die Unterschale zugewiesen wird,x
hat der neue Wert Auswirkungen auf die Unterschale, aber das anschließende Lesen ergibt den ursprünglichen Wert:Es ist keine sehr klare Art, dies auszudrücken, zumindest in der von Ihnen zitierten Passage. Wenn das ganze Buch so ist, können Sie möglicherweise ein besseres finden (oder stattdessen hier Fragen lesen).
quelle