Könnten Sie die folgenden Sätze aus dem Bash-Handbuch erklären $_
, insbesondere die fett gedruckten Teile, vielleicht mit einigen Beispielen?
Legen Sie beim Shell-Start den absoluten Pfadnamen fest, der zum Aufrufen der Shell oder des Shell-Skripts verwendet wird, die ausgeführt werden, wie in der Umgebungs- oder Argumentliste übergeben .
Anschließend dehnt sich auf das letzte Argument des vorherigen Befehls, nach der Expansion.
Stellen Sie auch 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.
Antworten:
Ich bin damit einverstanden, dass es nicht sehr klar ist.
1. Beim Start der Shell
wenn die
_
Variable in der Umgebung war , diebash
empfangen , dannbash
lässt er unberührt.Insbesondere dann , wenn die
bash
Schale von einem anderen aufgerufen wurdebash
Schal (obwohlzsh
,yash
und einigeksh
Implementierungen es auch tun), dann , dassbash
wird Shell das Set -_
Umgebungsvariable auf den Pfad des Befehls wird ausgeführt (die der dritte Punkt in Ihrer Frage ist). Wenn beispielsweisebash
aufgerufen wird, um ein Skript als Ergebnis einer anderenbash
Shell-Interpretation zu interpretieren:Das
bash
ist_=/path/to/bash-scrip
in der gegebenen Umgebung passiertbash-script
, und das ist der Anfangswert der$_
bash
Variablen in derbash
Shell, die dieses Skript interpretiert.Nun, wenn die auslösende Anwendung kein Pass -
_
Umgebungsvariable , die geltend gemachtebash
Schale wird initialisiert ,$_
um dieargv[0]
es sich erhält , welche sein könntebash
, oder/path/to/bash
oder/path/to/some-script
oder irgendetwas anderes (in dem obigen Beispiel, das wäre ,/bin/bash
wenn die sie Bang des Skripts war#! /bin/bash
oder/path/to/bash-script
abhängig vom System ).Dieser Text ist also irreführend, da er das Verhalten des Anrufers beschreibt,
bash
über den er keine Kontrolle hat. Die aufgerufene Anwendung wirdbash
möglicherweise überhaupt nicht festgelegt$_
(in der Praxis tunexeclp()
dies beispielsweise nur einige Shells und einige seltene interaktive Anwendungen nicht), oder sie kann für etwas völlig anderes verwendet werden (z. B.ksh93
setzt sie auf*pid*/path/to/command
).2. Anschließend
Das Folgende ist auch nicht sehr klar. In der Praxis ist dies der Fall, sobald
bash
ein einfacher Befehl in der aktuellen Shell-Umgebung interpretiert wird .Im Fall einer interaktiven Shell wird dies beispielsweise beim ersten einfachen Befehl interpretiert
/etc/bash.bashrc
.Zum Beispiel an der Eingabeaufforderung einer interaktiven Shell:
Bei einer nicht interaktiven Shell wäre dies der erste Befehl in
$BASH_ENV
oder des Codes, der dieser Shell zugeführt wird, wenn er$BASH_ENV
nicht festgelegt ist.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 sie eine_
Umgebungsvariable an Befehle, die sie ausführen und die den Pfad enthalten,bash
der als erstes Argument für dieexecve()
Systemaufrufe verwendet wurde.4. Beim Abrufen von E-Mails
Der vierte Punkt wird in der Beschreibung der
MAILPATH
Variablen ausführlicher beschrieben :Beispiel:
quelle
Versuchen Sie dieses einfache Beispiel:
Führen Sie es aus, indem Sie den absoluten Pfad (
/home/$USERNAME/test.sh
) angeben. Ausgabe:Der erste
$_
enthält den Pfad, den Sie zum Aufrufen des Skripts verwendet haben, und der zweite enthält das erste Argument in der Mitteecho
. Wenn Sie für das dritte Element in der Liste ein neues Terminal starten und echo eingeben,$_
wird die Variable angezeigt, diePATH
das enthält, das normalerweise zum Nachschlagen und Aufrufen von Befehlen (auf meinem Ubuntu-Computer) in einer normalen Shell oder einem absoluten Pfad zu Ihrer.bashrs
Datei in verwendet wird eine Login-Shell.Für den Punkt vier aus der Bash-Manpage:
quelle
echo $_
heißtEDITOR
, und warum ist es? Welchem Fall folgt es? (3) Können Sie ein Beispiel geben, wie Sie E-Mails abrufen und$_
in diesem Fall verwenden?.bashrc
und kommentieren Sie dort jede Zeile aus. Behalten Sie nur eine einzelne Zeile bei, die einen Befehl wieecho "test"
oder ähnlich enthält. Speichern und schließen. Dann laufenbash
und sofortecho $_
. Dieses letzte Echo sollte den Test in der Ausgabe drucken.MAILPATH
in linuxcommand.org/lc3_man_pages/bash1.htmlFür Fall 2 sagt ein Beispiel mehr als tausend Worte:
Tut, was Sie erraten / hoffen würden. Gibt mir einen einfachen Platzhalter, wenn ich in der Befehlszeile bin, damit ich mich nicht wiederholen muss.
quelle