Potresti spiegare le seguenti frasi dal manuale di Bash su $_
, soprattutto le parti in grassetto, magari con qualche esempio?
All'avvio della shell, imposta il percorso assoluto utilizzato per
richiamare la shell o lo script della shell in esecuzione come passato nell'ambiente
o nell'elenco di argomenti .Successivamente , espande l'ultimo argomento al comando
precedente, dopo l'espansione.Imposta anche il percorso completo utilizzato per richiamare ogni
comando eseguito e posizionato nell'ambiente esportato in quel comando .Quando controlla la posta , questo parametro contiene il nome del file di posta.
Risposta accettata:
Sono d'accordo che non è molto chiaro.
1. All'avvio della shell,
-
se il
_
era nell'ambiente chebash
ricevuto , quindibash
lascia intatto.In particolare, se quel
bash
shell è stata invocata da un altrobash
shell (sebbenezsh
,yash
e alcuniksh
le implementazioni lo fanno anche
), quindibash
shell avrà impostato il_
ambiente
al percorso del comando in esecuzione (questo è il 3°
punto nella tua domanda). Ad esempio, sebash
viene invocato per
interpretare uno script come risultato di un altrobash
interpretazione della shell:bash-script some args
Quella
bash
avrà superato_=/path/to/bash-scrip
nell'ambiente
dato abash-script
, ed è il valore iniziale
del$_
bash
la variabile sarà inbash
shell che
interpreta quello script.$ env -i _=whatever bash -c 'echo "$_"' whatever
-
Ora, se l'applicazione di richiamo non supera un
_
ambiente
variabile , ilbash
invocato la shell inizializzerà$_
all'argv[0]
riceve
stesso che potrebbe esserebash
o/path/to/bash
o/path/to/some-script
o qualsiasi altra cosa (nell'esempio sopra, che
sarebbe/bin/bash
se il botto della sceneggiatura fosse#! /bin/bash
o/path/to/bash-script
a seconda del
sistema).Quindi quel testo è fuorviante in quanto descrive il comportamento del
chiamante chebash
non ha alcun controllo su. L'applicazione che ha invocatobash
potrebbe benissimo non impostare$_
del tutto (in pratica, solo alcune
shell e alcune rare applicazioni interattive lo fanno,execlp()
non
per esempio), o potrebbe usarlo per qualcosa di completamente diverso
(per esempioksh93
lo imposta su*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. Successivamente
Il successivamente non è neanche molto chiaro. In pratica, non appena bash
interpreta un semplice comando nell'ambiente shell corrente.
-
Nel caso di una shell interattiva , che sarà sul primo semplice comando interpretato da
/etc/bash.bashrc
per esempio.Ad esempio, al prompt di una shell interattiva:
$ 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
-
Per una shell non interattiva , sarebbe il primo comando in
$BASH_ENV
o del codice inviato a quella shell se$BASH_ENV
non è
impostato.
3. Quando Bash esegue un comando
Il terzo punto è qualcosa di diverso ed è accennato nella discussione precedente.
bash
, come poche altre shell passeranno un _
variabile di ambiente ai comandi che esegue che contiene il percorso che bash
usato come primo argomento per execve()
chiamate di sistema.
$ env | grep '^_'
_=/usr/bin/env
4. Quando controlli la posta
Il quarto punto è descritto più dettagliatamente nella descrizione del MAILPATH
variabile:
'PERCORSO POSTALE'
Un elenco separato da due punti di nomi di file che la shell verifica periodicamente
per la nuova posta .
Ciascuna voce dell'elenco può specificare il messaggio che
viene stampato quando arriva nuova posta nel file di posta separando il nome del file
dal messaggio con un '?'.
Se utilizzato nel testo del messaggio
, '$_' si espande al nome del file di posta corrente.
Esempio:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>