Fondamentalmente, è l'ultimo argomento del comando precedente.
!$
è la "fine" del comando precedente. Considera il seguente esempio: iniziamo cercando una parola in un file:
grep -i joe /some/long/directory/structure/user-lists/list-15
se joe è in quell'elenco utenti, vogliamo rimuoverlo da esso. Possiamo accendere vi con quel lungo albero di directory come argomento, o semplicemente come vi !$
Quale bash si espande in:
vi /some/long/directory/structure/user-lists/list-15
( fonte ; guida pratica, a proposito)
Non vale nulla la distinzione tra questo !$
token e la speciale variabile shell $_
. In effetti, entrambi si espandono all'ultimo argomento del comando precedente. Tuttavia, !$
viene espanso durante l' espansione della cronologia , mentre $_
viene espanso durante l' espansione dei parametri . Una conseguenza importante di ciò è che, quando si utilizza !$
, il comando espanso viene salvato nella cronologia.
Ad esempio, considerare le sequenze di tasti
(Gli unici caratteri modificati sono $!
e $_
nel mezzo.)
Nel primo, quando si preme Up, viene visualizzata la riga di comando echo Foo Jar
, quindi l'ultima riga scritta su stdout è Foo Jar
.
In quest'ultimo caso, quando si preme Up, la riga di comando legge echo $_ bar
, ma ora $_
ha un valore diverso rispetto a prima: in effetti lo $_
è ora Jar
, quindi l'ultima riga scritta su stdout è Jar Jar
.
Un'altra conseguenza è che _
può essere utilizzato in altre espansioni di parametri, ad esempio la sequenza di comandi
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
stampe isomorphism isosceles
. Ma non esiste un'analoga " ${!$%morphism}
" espansione.
Per ulteriori informazioni sulle fasi di espansione in Bash, consultare la EXPANSION
sezione di man 1 bash
(questo si chiama Shell Expansions nell'edizione online). La HISTORY EXPANSION
sezione è separata
echo
qualcosa se non si è sicuri di cosa farà.