Könnten Sie die folgenden Sätze aus dem Bash-Handbuch über $_
erklären , insbesondere die fettgedruckten Teile, vielleicht mit einigen Beispielen?
Beim Start der Shell auf den absoluten Pfadnamen setzen, der zum
Aufrufen der Shell oder des Shell-Skripts verwendet wird, das ausgeführt wird, wenn es in der Umgebung
oder der Argumentliste übergeben wird .Anschließend , wird nach der Erweiterung bis zum letzten Argument des vorherigen
Befehls erweitert.Auch auf den vollständigen Pfadnamen gesetzt, der zum Aufrufen jedes
ausgeführten Befehls verwendet wird und in der Umgebung platziert, die zu diesem Befehl exportiert wurde .Beim Abrufen von E-Mails , enthält dieser Parameter den Namen der Maildatei.
Akzeptierte Antwort:
Ich stimme zu, dass es nicht sehr klar ist.
1. Beim Start der Shell,
-
wenn der
_
Variable war in der Umgebung, diebash
erhalten , dannbash
lässt es unberührt.Insbesondere, wenn
bash
Shell wurde von einer anderenbash
aufgerufen Shell (obwohlzsh
,yash
und etwasksh
Implementierungen tun es auch
), dannbash
Shell wird den_
gesetzt haben environment
Variable zum Pfad des auszuführenden Befehls (das ist der 3.
Punkt in Ihrer Frage). Wenn beispielsweisebash
wird aufgerufen, um
ein Skript als Ergebnis einer anderenbash
zu interpretieren Shell-Interpretation:bash-script some args
Dieser
Bash
wird_=/path/to/bash-scrip
übergeben haben in der
Umgebung, diebash-script
gegeben wird , und das ist der anfängliche
Wert von$_
bash
Variable wird in derbash
sein Shell, die
dieses Skript interpretiert.$ env -i _=whatever bash -c 'echo "$_"' whatever
-
Nun, wenn die aufrufende Anwendung keinen
_
übergibt Umgebungsvariable
, die aufgerufenebash
Shell initialisiert$_
zuargv[0][0][code> es empfängt
sich selbst, wasbash
sein könnte , oder/path/to/bash
oder/path/to/some-script
oder etwas anderes (im obigen Beispiel wäre das
/bin/bash
wenn die She-Bang des Skripts#! /bin/bash
oder/path/to/bash-script
abhängig vom
System).Dieser Text ist also irreführend, da er das Verhalten des
Aufrufers beschreibt, derbash
hat keine Kontrolle über. Die Anwendung, diebash
aufgerufen hat kann sehr gut$_
nicht setzen überhaupt (in der Praxis tun dies nur einige
Shells und einige seltene interaktive Anwendungen,execlp()
nicht
zum Beispiel), oder es könnte es für etwas ganz anderes verwenden
(zum Beispielksh93
). setzt es auf*pid*/path/to/command
).$ env bash -c 'echo "$_"' /usr/bin/env (env did not set it to /bin/bash, so the value we get is the one passed to env by my interactive shell) $ ksh93 -c 'bash -c "echo $_"' *20042*/bin/bash
2. Anschließend
Die Anschließend ist auch nicht ganz klar. In der Praxis ist das so schnell wie bash
interpretiert einen einfachen Befehl in der aktuellen Shell-Umgebung.
-
Im Falle einer interaktiven Shell , das ist der erste einfache Befehl, der von
/etc/bash.bashrc
interpretiert wird zum Beispiel.Zum Beispiel am Prompt einer interaktiven Shell:
$ echo "$_" ] (the last arg of the last command from my ~/.bashrc) $ f() { echo test; } $ echo "$_" ] (the command-line before had no simple command, so we get the last argument of that previous echo commandline) $ (: test) $ echo "$_" ] (simple command, but in a sub-shell environment) $ : test $ echo "$_" test
-
Für eine nicht interaktive Shell , wäre es der erste Befehl in
$BASH_ENV
oder des Codes, der dieser Shell zugeführt wird, wenn$BASH_ENV
ist nicht
gesetzt.
3. Wenn Bash einen Befehl ausführt
Der dritte Punkt ist etwas anderes und wird in der obigen Diskussion angedeutet.
bash
, wie einige andere Shells, übergeben einen _
Umgebungsvariable zu Befehlen, die sie ausführt, die den Pfad enthält, den bash
wird als erstes Argument für execve()
verwendet Systemaufrufe.
$ env | grep '^_'
_=/usr/bin/env
4. Beim Abrufen von E-Mails
Der vierte Punkt wird in der Beschreibung des MAILPATH
näher beschrieben Variable:
„MAILPFAD“
Eine durch Doppelpunkte getrennte Liste von Dateinamen, die die Shell regelmäßig
auf neue E-Mails überprüft .
Jeder Listeneintrag kann die Nachricht angeben, die
gedruckt wird, wenn neue E-Mails in der E-Mail-Datei eintreffen indem Sie den
Dateinamen von der Nachricht mit einem '?' trennen.
Wenn es im Text der
Nachricht verwendet wird, wird '$_' zum Namen der aktuellen Maildatei erweitert.
Beispiel:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>