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, diebasherhalten , dannbashlässt es unberührt.Insbesondere, wenn
bashShell wurde von einer anderenbashaufgerufen Shell (obwohlzsh,yashund etwaskshImplementierungen tun es auch
), dannbashShell wird den_gesetzt haben environment
Variable zum Pfad des auszuführenden Befehls (das ist der 3.
Punkt in Ihrer Frage). Wenn beispielsweisebashwird aufgerufen, um
ein Skript als Ergebnis einer anderenbashzu interpretieren Shell-Interpretation:bash-script some argsDieser
Bashwird_=/path/to/bash-scripübergeben haben in der
Umgebung, diebash-scriptgegeben wird , und das ist der anfängliche
Wert von$_bashVariable wird in derbashsein Shell, die
dieses Skript interpretiert.$ env -i _=whatever bash -c 'echo "$_"' whatever -
Nun, wenn die aufrufende Anwendung keinen
_übergibt Umgebungsvariable
, die aufgerufenebashShell initialisiert$_zuargv[0][0][code> es empfängt
sich selbst, wasbashsein könnte , oder/path/to/bashoder/path/to/some-scriptoder etwas anderes (im obigen Beispiel wäre das
/bin/bashwenn die She-Bang des Skripts#! /bin/bashoder/path/to/bash-scriptabhängig vom
System).Dieser Text ist also irreführend, da er das Verhalten des
Aufrufers beschreibt, derbashhat keine Kontrolle über. Die Anwendung, diebashaufgerufen 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.bashrcinterpretiert 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_ENVoder des Codes, der dieser Shell zugeführt wird, wenn$BASH_ENVist 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>