Básicamente, es el último argumento del comando anterior.
!$es el "fin" del comando anterior. Considere el siguiente ejemplo: Comenzamos buscando una palabra en un archivo:
grep -i joe /some/long/directory/structure/user-lists/list-15
Si Joe está en esa lista de usuarios, queremos eliminarlo. Podemos activar vi con ese árbol de directorios largo como argumento, o simplemente como vi !$Which bash se expande a:
vi /some/long/directory/structure/user-lists/list-15
( fuente ; guía práctica, por cierto)
No vale nada la distinción entre este !$token y la variable de shell especial $_. De hecho, ambos se expanden al último argumento del comando anterior. Sin embargo, !$se expande durante la expansión del historial , mientras que $_se expande durante la expansión de parámetros . Una consecuencia importante de esto es que, cuando usa !$, el comando expandido se guarda en su historial.
Por ejemplo, considere las pulsaciones de teclas
(Los únicos caracteres cambiados son $!y $_en el medio).
En el primero, cuando presiona Up, se lee la línea de comando echo Foo Jar, por lo que la última línea escrita en stdout es Foo Jar.
En el último, cuando presiona Up, la línea de comando se lee echo $_ bar, pero ahora $_tiene un valor diferente al que tenía anteriormente; de hecho, $_es ahora Jar, por lo que la última línea escrita en stdout es Jar Jar.
Otra consecuencia es que _puede usarse en otras expansiones de parámetros, por ejemplo, la secuencia de comandos
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
impresiones isomorphism isosceles. Pero no hay una " ${!$%morphism}" expansión análoga .
Para obtener más información sobre las fases de expansión en Bash, consulte la EXPANSIONsección deman 1 bash (esto se llama Expansiones de Shell en la edición en línea). La HISTORY EXPANSIONsección está separada.
echoalgo si no está seguro de lo que hará.