Basicamente, é o último argumento para o comando anterior.
!$é o "fim" do comando anterior. Considere o seguinte exemplo: Começamos procurando uma palavra em um arquivo:
grep -i joe /some/long/directory/structure/user-lists/list-15
se joe estiver nessa lista de usuários, queremos removê-lo. Podemos iniciar o vi com essa longa árvore de diretórios como argumento, ou simplesmente como vi !$Qual bash se expande para:
vi /some/long/directory/structure/user-lists/list-15
( fonte ; guia prático, a propósito)
Não vale nada a distinção entre esse !$token e a variável shell especial $_. De fato, ambos se expandem para o último argumento do comando anterior. No entanto, !$é expandido durante a expansão do histórico , enquanto $_é expandido durante a expansão de parâmetros . Uma conseqüência importante disso é que, quando você usa !$, o comando expandido é salvo no seu histórico.
Por exemplo, considere as teclas digitadas
(Os únicos caracteres alteradas são o $!e $_no meio).
No primeiro, quando você pressiona Up, a linha de comando lê echo Foo Jar; portanto, a última linha gravada em stdout é Foo Jar.
Neste último, quando você pressiona Up, 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 em 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
impressões isomorphism isosceles. Mas não há ${!$%morphism}expansão " " análoga .
Para obter mais informações sobre as fases de expansão no Bash, consulte a EXPANSIONseção man 1 bash(isso é chamado de expansões de shell na edição online). A HISTORY EXPANSIONseção é separada.
echoalgo se você não tiver certeza do que ele fará.