GNU/Linux >> Znalost Linux >  >> Linux

Chápete význam `$_`?

Mohl byste vysvětlit následující věty z Bash manuálu o $_ , zejména části zvýrazněné tučně, možná s příklady?

  1. Při spuštění shellu nastavte absolutní cestu použitou k
    vyvolání shellu nebo skriptu shellu, který se spouští jako předaný v prostředí
    nebo seznamu argumentů
    .

  2. Následně , se po expanzi rozvine na poslední argument předchozího
    příkazu.

  3. Nastavit také na úplnou cestu použitou k vyvolání každého
    provedeného příkazu
    a umístěny do prostředí exportovaného do tohoto příkazu .

  4. Při kontrole pošty , tento parametr obsahuje název souboru pošty.

Přijatá odpověď:

Souhlasím, že to není příliš jasné.

1. Při spuštění shellu,

  • pokud je _ proměnná byla v prostředí, které bash obdržela a poté bash nechává to nedotčené.

    Zejména pokud to bash shell byl vyvolán jiným bash shell (ačkoli zsh , yash a nějaké ksh implementace také dělají
    to), pak ten bash shell bude mít nastaven _ prostředí
    k cestě příkazu, který se provádí (to je 3.
    bod ve vaší otázce). Například pokud bash je vyvolán, aby
    interpretoval skript jako výsledek jiného bash interpretace shellu:

    bash-script some args
    

    Ten bash bude předáno _=/path/to/bash-scrip v prostředí
    daném bash-script , a to je počáteční
    hodnota $_ bash proměnná bude v bash shell, který
    interpretuje daný skript.

    $ env -i _=whatever bash -c 'echo "$_"'
    whatever
    
  • Nyní, pokud vyvolávající aplikace nepředá _ prostředí
    proměnná
    , vyvolaný bash shell inicializuje $_ do argv[0] přijímá
    sebe, což může být bash , nebo /path/to/bash nebo /path/to/some-script nebo cokoli jiného (ve výše uvedeném příkladu by to
    bylo /bin/bash pokud by nářez skriptu byl #! /bin/bash nebo /path/to/bash-script v závislosti na
    systému).

    Tento text je tedy zavádějící, protože popisuje chování
    volajícího, který bash nemá kontrolu nad. Aplikace, která vyvolala bash nemusí velmi dobře nastavit $_ vůbec (v praxi to dělají jen některé
    shelly a několik vzácných interaktivních aplikací, execlp() ne
    například), nebo by jej mohl použít pro něco úplně jiného
    (například ksh93 nastaví jej na *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. Následně

Následně také není příliš jasné. V praxi to je, jakmile bash interpretuje jednoduchý příkaz v aktuálním prostředí shellu.

  • V případě interaktivního shellu , který bude na prvním jednoduchém příkazu interpretovaném z /etc/bash.bashrc například.

    Například na výzvu interaktivního shellu:

     $ 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
    
  • Pro neinteraktivní prostředí , byl by to první příkaz v $BASH_ENV nebo kódu přiváděného do tohoto shellu, pokud $BASH_ENV není
    nastaveno.

Související:Rozdíl mezi aplikacemi GTK a QT?

3. Když Bash provede příkaz

Třetí bod je něco jiného a je naznačen v diskuzi výše.

bash , stejně jako několik dalších shellů předá _ prostředí na příkazy, které provádí a které obsahují cestu, která bash používá se jako první argument pro execve() systémová volání.

$ env | grep '^_'
_=/usr/bin/env

4. Při kontrole pošty

Čtvrtý bod je podrobněji popsán v popisu MAILPATH proměnná:

„MAILPATH“

Dvojtečkou oddělený seznam názvů souborů, které shell pravidelně
kontroluje na novou poštu
.

Každá položka seznamu může specifikovat zprávu, která
se vytiskne, když do souboru pošty dorazí nová pošta
oddělením
souboru od zprávy znakem '?'.
Při použití v textu
zprávy se '$_' rozšíří na název aktuálního poštovního souboru.

Příklad:

$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>

Linux
  1. Přizpůsobení prostředí Bash

  2. Rychlá navigace v adresáři v prostředí Bash?

  3. Význam $? Ve skriptu Shell?

  1. Jak BASH Shell načítá své konfigurační soubory v Linuxu

  2. Co znamená POSIX?

  3. Jaký je význam `! -d` v tomto příkazu Bash?

  1. Účel .bashrc a jak to funguje?

  2. The Bash ‘?

  3. Jaký je rozdíl mezi prováděním skriptu Bash a jeho získáváním?