Nachdem ich das ausgeführt habe set -a var=99
, kann ich einen Satz in der Ausgabe von finden set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Kann mir jemand sagen, was "_ =" bedeutet?
Ich stelle fest, echo $var
dass nichts geben wird. Wenn ich die ausführe set -a
, set
wird diese Variable nicht mehr berücksichtigt. Was ist los?
Antworten:
Wenn Sie ausführen
set -a var=99
, passieren drei verschiedene Dinge (im Zusammenhang mit Ihrer Frage):-a
) (rückgängig machenset +a
), um Variablen zu exportieren.$1
gesetzt aufvar=99
).$_
wird auf den letzten Parameter gesetzt (erweitert).set -a
Die Ausführung
set -a
markiert alle nachfolgenden (neuen oder geänderten) Variablen als exportiert (in allen Shells, außercsh
einigen verwandten Shells).Um diese Einstellung wiederherzustellen, ändern Sie einfach die Einstellung
-
in a+
:setze var = 99
Das sollte eigentlich sein
set -- var=99
, um die Interpretation einer Option (und Menge hat viel) mit Werten zu vermeiden, die mit einem Bindestrich (-
) beginnen.Setzt die Liste der Argumente (die Liste der Positionsparameter) auf die nach dem
--
. Das gilt für alle vernünftigen Shells (nicht für csh et al). Positionsargumente werden mit "$ @" (oder ähnlichem "$ *", ungleich) gedruckt._ = letztes_Argument
Der Wert der internen Shell-Variablen
_
ändert sich in das letzte Argument der ausgeführten Zeile. Das gilt NICHT für fast alle Shells (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh und natürlich csh und tcsh) außer bash.Bitte beachten Sie, dass der Wert in
$_
dem Wert nach der Erweiterung entspricht:Deshalb, wenn Sie ausführen:
Sie erhalten eine Beschreibung der Shell-Variablen '$ _'. Das funktioniert auch:
quelle
Der Unterstrich ist eigentlich eine spezielle Shell-Variable. Was Sie hier sehen, ist die
_
Variable underscore ( ) mit dem Wertvar=99
. Es ist schreibgeschützt und wird von der Shell verwaltet. Es ist:Ihr Beispiel fällt in die zweite Kategorie. Sie tippten:
Also das letzte Argument war
var=99
, und das war der Wert Sie Einstellung wurden (Sie waren nicht Einstellungvar
zu99
). Daher_
wurde darauf gesetzt. Und das wird berichtet:Es ist ein bisschen verwirrend, aber das erste
=
zeigt die Zuweisung zur Variablen an_
, und das zweite ist Teil des Werts.Es ist auch erwähnenswert , dass die
-a
Optionset
bewirkt , dass alle nachfolgend definierten Variablen exportiert werden.quelle
Die richtige Antwort hängt von der verwendeten Shell ab:
bash
, was auch immer @BobEager sagte, trifft zuzsh
, es ist nur das letzte Argument des vorherigen Befehls, und auf den vollständigen Pfad des Befehls in der Umgebung des Befehlssatzesdash
legen diese Variable nur fest, wenn eine interaktive Sitzung ausgeführt wirdEs kann auch andere Besonderheiten in anderen Schalen geben. Als solches
$_
ist es in POSIX nicht definiert , daher sollte man sich potenzieller Portabilitätsprobleme bewusst sein, wenn man es verwendet.Randnotiz: Wenn Sie beabsichtigen, den Wert 99 zuzuweisen
var
und ihn in der Umgebung nachfolgender Unterprozesse verfügbar zu machen, lautet die richtige Syntax, um dies zu erreichen:quelle
unset var;set -a; var=99
. Funktioniert in allen vernünftigen Shells (nicht bei csh et al).In der nicht ganz so feinen Grafik von bash (1) finden wir
Das heißt,
set -a var=99
setzt die Umgebungsvariable nichtvar
auf99
; es setzt$1
aufvar=99
. Versuchen Sieecho "$1"
oderecho "$*"
und Sie werden sehen.quelle