GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verstehen Sie die Bedeutung von `$_`?

Könnten Sie die folgenden Sätze aus dem Bash-Handbuch über $_ erklären , insbesondere die fettgedruckten Teile, vielleicht mit einigen Beispielen?

  1. 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
    .

  2. Anschließend , wird nach der Erweiterung bis zum letzten Argument des vorherigen
    Befehls erweitert.

  3. 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 .

  4. 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, die bash erhalten , dann bash lässt es unberührt.

    Insbesondere, wenn bash Shell wurde von einer anderen bash aufgerufen Shell (obwohl zsh , yash und etwas ksh Implementierungen tun es auch
    ), dann bash Shell wird den _ gesetzt haben environment
    Variable zum Pfad des auszuführenden Befehls (das ist der 3.
    Punkt in Ihrer Frage). Wenn beispielsweise bash wird aufgerufen, um
    ein Skript als Ergebnis einer anderen bash zu interpretieren Shell-Interpretation:

    bash-script some args
    

    Dieser Bash wird _=/path/to/bash-scrip übergeben haben in der
    Umgebung, die bash-script gegeben wird , und das ist der anfängliche
    Wert von $_ bash Variable wird in der bash sein Shell, die
    dieses Skript interpretiert.

    $ env -i _=whatever bash -c 'echo "$_"'
    whatever
    
  • Nun, wenn die aufrufende Anwendung keinen _ übergibt Umgebungsvariable
    , die aufgerufene bash Shell initialisiert $_ zu argv[0][0][code> es empfängt
    sich selbst, was bash 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, der bash hat keine Kontrolle über. Die Anwendung, die bash 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 Beispiel ksh93). 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.

Verwandte:Unterschied zwischen GTK- und QT-Anwendungen?

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>

Linux
  1. Navigieren in der Bash-Shell mit pushd und popd

  2. Welches sind die speziellen Parameter/Variablen der (Bash-)Shell?

  3. Anpassen der Bash Shell:Fett/Farbe Der Befehl?

  4. Wie liest man das gesamte Shell-Skript, bevor man es ausführt?

  5. Die Bedeutung von $? In einem Shell-Skript?

.bashrc vs. .bash_profile

Was ist die Shell unter Linux?

Die Bash‘?

Bash fc-Befehl:Verwenden Sie die Bash-Shell ganz einfach wie ein Profi

Wie die BASH-Shell ihre Konfigurationsdateien unter Linux lädt

Was bedeutet POSIX?