Was bedeutet "_ ="?

29

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 $vardass nichts geben wird. Wenn ich die ausführe set -a, setwird diese Variable nicht mehr berücksichtigt. Was ist los?

yode
quelle

Antworten:

16

Wenn Sie ausführen set -a var=99, passieren drei verschiedene Dinge (im Zusammenhang mit Ihrer Frage):

  1. Eine festgelegte Option ( -a) (rückgängig machen set +a), um Variablen zu exportieren.
  2. Positionsparameter werden auf die folgenden Optionen "gesetzt" ( $1gesetzt auf var=99).
  3. Der Unterstrich der Shell-Variablen $_wird auf den letzten Parameter gesetzt (erweitert).

set -a

Die Ausführung set -amarkiert alle nachfolgenden (neuen oder geänderten) Variablen als exportiert (in allen Shells, außer csheinigen verwandten Shells).

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

Um diese Einstellung wiederherzustellen, ändern Sie einfach die Einstellung -in a +:

$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

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.

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

_ = 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.

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

Bitte beachten Sie, dass der Wert in $_dem Wert nach der Erweiterung entspricht:

$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

Deshalb, wenn Sie ausführen:

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

Sie erhalten eine Beschreibung der Shell-Variablen '$ _'. Das funktioniert auch:

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"
Pfeil
quelle
37

Der Unterstrich ist eigentlich eine spezielle Shell-Variable. Was Sie hier sehen, ist die _Variable underscore ( ) mit dem Wert var=99. Es ist schreibgeschützt und wird von der Shell verwaltet. Es ist:

  • Wird beim Starten der Shell festgelegt und enthält den absoluten Dateinamen der Shell oder des Skripts, die bzw. das ausgeführt wird, wie in der Argumentliste angegeben.
  • Danach wird es nach der Erweiterung bis zum letzten Argument des vorherigen Befehls erweitert.
  • Beim Überprüfen von E-Mails enthält dieser Parameter den Namen der Mail-Datei.
  • Es wird auch der vollständige Pfadname jedes Befehls angegeben, der ausgeführt und in die für diesen Befehl exportierte Umgebung gestellt wird.

Ihr Beispiel fällt in die zweite Kategorie. Sie tippten:

set -a var=99  

Also das letzte Argument war var=99, und das war der Wert Sie Einstellung wurden (Sie waren nicht Einstellung varzu 99). Daher _wurde darauf gesetzt. Und das wird berichtet:

_=var=99  

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 -aOption setbewirkt , dass alle nachfolgend definierten Variablen exportiert werden.

Bob Eager
quelle
16

Die richtige Antwort hängt von der verwendeten Shell ab:

  • für bash, was auch immer @BobEager sagte, trifft zu
  • für zsh, es ist nur das letzte Argument des vorherigen Befehls, und auf den vollständigen Pfad des Befehls in der Umgebung des Befehlssatzes
  • Einige Shells dashlegen diese Variable nur fest, wenn eine interaktive Sitzung ausgeführt wird

Es 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 varund ihn in der Umgebung nachfolgender Unterprozesse verfügbar zu machen, lautet die richtige Syntax, um dies zu erreichen:

export var=99
Dmitry Grigoryev
quelle
2
Eine auch korrekte Syntax ist unset var;set -a; var=99. Funktioniert in allen vernünftigen Shells (nicht bei csh et al).
Arrow
1
@Arrow Obwohl nach der letzten Zeile von Bob Eager Antwort dies würde alle Variablen anschließend eingestellt / geändert exportiert, die möglicherweise nicht, was Sie wollen.
TripeHound
8

Und ich nehme echo $varzur Kenntnis, wird nichts geben. … Was ist passiert?

In der nicht ganz so feinen Grafik von bash (1) finden wir

set[ --abefhkmnptuvxBCEHPT] [ Optionsname ] [ arg …]   [ ] [ Optionsname ] [ arg …]-o
set+abefhkmnptuvxBCEHPT+o

            ︙
    Wenn Optionen angegeben werden, setzen sie Shell-Attribute oder heben sie auf. Alle Argumente , die nach Option Verarbeitung werden als Werte für die Positionsparameter behandelt und zugeordnet sind, um zu $1, $2... .$n

Das heißt, set -a var=99setzt die Umgebungsvariable nicht varauf 99; es setzt $1auf var=99. Versuchen Sie echo "$1"oder echo "$*"und Sie werden sehen.

Scott
quelle