Basicamente, é o último argumento para o comando anterior.
!$
is the "end" of the previous command. Consider the following example: We start by looking for a word in a file:grep -i joe /some/long/directory/structure/user-lists/list-15
if joe is in that userlist, we want to remove him from it. We can either fire up vi with that long directory tree as the argument, or as simply as
vi !$
Which bash expands to:vi /some/long/directory/structure/user-lists/list-15
( fonte ; guia prático, pelo caminho)
Não vale a pena a distinção entre este token !$
e a variável especial $_
da shell.
De fato, ambos expandem para o último argumento do comando anterior. No entanto, !$
é expandido durante expansão do histórico , enquanto $_
é expandido durante a expansão do parâmetro .
Uma conseqüência importante disso é que, quando você usa !$
, o comando expandido é salvo em seu histórico.
Por exemplo, considere as combinações de teclas
-
echo Foo
Entreecho !$ Jar
Entre Acima Digite ; e -
echo Foo
Insiraecho $_ Jar
Entre Acima Digite .
(Os únicos caracteres alterados são $!
e $_
no meio).
No primeiro, quando você pressiona Acima , a linha de comando lê echo Foo Jar
, então a última linha gravada no stdout é Foo Jar
.
No último, quando você pressiona Acima , a linha de comando lê echo $_ bar
, mas agora $_
tem um valor diferente do que anteriormente - na verdade, $_
agora é Jar
, então a última linha gravada no stdout é Jar Jar
.
Outra conseqüência é que _
pode ser usado em outras expansões de parâmetros, por exemplo, a sequência de comandos
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
imprime isomorphism isosceles
.
Mas não há expansão " ${!$%morphism}
" análoga.
Para obter mais informações sobre as fases de expansão no Bash, consulte a seção EXPANSION
de man 1 bash
(isso é chamado de Expansões da Shell na edição on-line). A seção HISTORY EXPANSION
é separada.