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 EXPANSIONsezione di man 1 bash(questo si chiama Shell Expansions nell'edizione online). La HISTORY EXPANSIONsezione è separata
echoqualcosa se non si è sicuri di cosa farà.