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 chebashricevuto , quindibashlascia intatto.In particolare, se quel
bashshell è stata invocata da un altrobashshell (sebbenezsh,yashe alcunikshle implementazioni lo fanno anche
), quindibashshell avrà impostato il_ambiente
al percorso del comando in esecuzione (questo è il 3°
punto nella tua domanda). Ad esempio, sebashviene invocato per
interpretare uno script come risultato di un altrobashinterpretazione della shell:bash-script some argsQuella
bashavrà superato_=/path/to/bash-scripnell'ambiente
dato abash-script, ed è il valore iniziale
del$_bashla variabile sarà inbashshell che
interpreta quello script.$ env -i _=whatever bash -c 'echo "$_"' whatever -
Ora, se l'applicazione di richiamo non supera un
_ambiente
variabile , ilbashinvocato la shell inizializzerà$_all'argv[0]riceve
stesso che potrebbe esserebasho/path/to/basho/path/to/some-scripto qualsiasi altra cosa (nell'esempio sopra, che
sarebbe/bin/bashse il botto della sceneggiatura fosse#! /bin/basho/path/to/bash-scripta seconda del
sistema).Quindi quel testo è fuorviante in quanto descrive il comportamento del
chiamante chebashnon ha alcun controllo su. L'applicazione che ha invocatobashpotrebbe 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 esempioksh93lo 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.bashrcper 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_ENVo del codice inviato a quella shell se$BASH_ENVnon è
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>