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?
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ů .Následně , se po expanzi rozvine na poslední argument předchozího
příkazu.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 .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ébashobdržela a potébashnechává to nedotčené.Zejména pokud to
bashshell byl vyvolán jinýmbashshell (ačkolizsh,yasha nějakékshimplementace také dělají
to), pak tenbashshell bude mít nastaven_prostředí
k cestě příkazu, který se provádí (to je 3.
bod ve vaší otázce). Například pokudbashje vyvolán, aby
interpretoval skript jako výsledek jinéhobashinterpretace shellu:bash-script some argsTen
bashbude předáno_=/path/to/bash-scripv prostředí
danémbash-script, a to je počáteční
hodnota$_bashproměnná bude vbashshell, který
interpretuje daný skript.$ env -i _=whatever bash -c 'echo "$_"' whatever -
Nyní, pokud vyvolávající aplikace nepředá
_prostředí
proměnná , vyvolanýbashshell inicializuje$_doargv[0]přijímá
sebe, což může býtbash, nebo/path/to/bashnebo/path/to/some-scriptnebo cokoli jiného (ve výše uvedeném příkladu by to
bylo/bin/bashpokud by nářez skriptu byl#! /bin/bashnebo/path/to/bash-scriptv závislosti na
systému).Tento text je tedy zavádějící, protože popisuje chování
volajícího, kterýbashnemá kontrolu nad. Aplikace, která vyvolalabashnemusí 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říkladksh93nastaví 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.bashrcnapří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_ENVnebo kódu přiváděného do tohoto shellu, pokud$BASH_ENVnení
nastaveno.
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>