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ébash
obdržela a potébash
nechává to nedotčené.Zejména pokud to
bash
shell byl vyvolán jinýmbash
shell (ačkolizsh
,yash
a nějakéksh
implementace také dělají
to), pak tenbash
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 pokudbash
je vyvolán, aby
interpretoval skript jako výsledek jinéhobash
interpretace shellu:bash-script some args
Ten
bash
bude předáno_=/path/to/bash-scrip
v prostředí
danémbash-script
, a to je počáteční
hodnota$_
bash
proměnná bude vbash
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$_
doargv[0]
přijímá
sebe, což může býtbash
, 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á vyvolalabash
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říkladksh93
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.
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>