Bash Manual sagt (Manpage, mein Schwerpunkt):
Wenn Bash einen externen Befehl aufruft, wird die Variable
$_
auf den vollständigen Pfadnamen des Befehls gesetzt und in seiner Umgebung an diesen Befehl übergeben.
Und ( spezielle Parameter ):
_
(
$_
, ein Unterstrich.) Legen Sie beim Start der Shell den absoluten Pfadnamen fest, der zum Aufrufen der Shell oder des Shell-Skripts verwendet wird, die bzw. das in der Umgebungs- oder Argumentliste übergeben wird. Erweitert anschließend nach der Erweiterung zum letzten Argument des vorherigen Befehls. Stellen Sie außerdem den vollständigen Pfadnamen ein, der zum Aufrufen jedes ausgeführten und in die in diesen Befehl exportierte Umgebung platzierten Befehls verwendet wird. Beim Überprüfen von E-Mails enthält dieser Parameter den Namen der E-Mail-Datei.
In einer Bash-Shell laufe ich:
$ bash $ export | grep '_='
Laut Handbuch
_
sollte eine Umgebungsvariable der neuen Bash-Shell sein.export
soll alle Umgebungsvariablen der neuen Bash-Shell ausgeben, gibt aber nicht aus_
. Ich frage mich also, ob_
es sich um eine Umgebungsvariable der neuen Bash-Shell handelt.Tatsächlich passiert in jeder Bash-Shell dasselbe
$ export | grep '_='
gibt nichts aus. Ich frage mich also, ob
_
es jemals eine Umgebungsvariable einer Bash-Shell gibt.Zum Vergleich:
$ dash $ export | grep '_=' export _='/bin/dash'
Mein Beitrag ist inspiriert von Mikes Kommentar und Stephanes Antwort .
export
ist ein eingebautes Gerät, aber wenn Sie es verwendenprintenv _
, zeigt es Ihnen, wie es aufgerufen wurde:/usr/bin/printenv
auf diesem System.bash -c export | grep _=
(von Bash), wird zeigen , wie die Eltern - Shell den aufgerufenenbash
Befehl, obwohl$_
ist ungesetzt in den Eltern.Antworten:
Ja,
_
ist eine Umgebungsvariable der neuen Bash-Shell. Sie können das sehen, indem Sie laufeninnerhalb der Shell: Zeigt den Inhalt der ursprünglichen Umgebung der Shell an. Sie werden es in der ersten Shell nicht sehen, da es vor dem Start keine vorherige Shell gab, um es festzulegen.
Das Erweitern
$_
in Bash bezieht sich auf den_
speziellen Parameter, der bis zum letzten Argument des vorherigen Befehls erweitert wird. (Intern behandelt Bash dies mithilfe einer_
Shell-Variablen, die jedes Mal aktualisiert wird, wenn ein Befehl analysiert wird. Dies ist jedoch wirklich ein Implementierungsdetail. Sie wird jedes Mal "nicht exportiert", wenn ein Befehl analysiert wird. ) Wird nicht angezeigtexport
,_
da dies nicht der Fall ist eine Variable, die als exportiert markiert ist; Sie können es jedoch in der Ausgabe von sehenset
.Im ersten Beispiel die neue Shell Parsen Bash und führt die Befehle in die Startdateien, so beim Laufen
explore | grep '-='
,_
wurde bereits überschrieben und markiert als nicht exportiert.In diesem
dash
Beispiel scheint keine Startdatei ausgeführt zu werden. Sie sehen die Variable also als Umgebungsvariable, die von Bash vor der Ausführung festgelegt wurdedash
.quelle
export | grep '_='
ausgegeben? Warum wird in der ursprünglichen Bash-Shell nichtstr '\0' '\n' < /proc/$$/environ | grep _=
ausgegeben?_
die Umgebung verlassen wird und wie ich sie wieder in die Umgebung exportieren kann .export
ohne Argumente listet alle exportierten Variablen auf ._
ist keine Variable, sondern wird als spezieller Parameter aufgeführt .Etwas verwirrend
_
wäre auch ein gültiger Name für eine Variable , im Gegensatz zu den Namen der anderen speziellen Parameter. Zumindest Bash 4.4 erlaubt Zuweisungen ohne Beanstandungen. Es ist einfach nicht nützlich, weil der Spezialeffekt den Wert sofort überschreibt.quelle
_
als Variable zu verwenden ;-). Es ist praktisch nur schreibgeschützt und der Wert geht sofort verloren._
als Variable behandelt, weshalb es in der Ausgabe von angezeigt wirdset
. Es kann jedoch nicht als exportiert markiert werden, soweit ich feststellen kann.Nicht jede Shell-Variable wird als exportiert markiert, wie Sie in der Ausgabe von sehen können
declare -p
.Es macht keinen Sinn
bash
,$_
als exportiert zu markieren, da diese Variable automatisch zur Umgebung untergeordneter Prozesse hinzugefügt wird, jedoch mit einem anderen Wert als dem, den sie (zu diesem Zeitpunkt) in der Shell hat.Das Anzeigen als exportiert würde den Benutzer nur verwirren, was mit der Umgebung externer Befehle passieren wird.
Alle "Laufzeitvariablen"
BASH*
werden nicht exportiert.quelle