!$
é um designador de palavras de expansão de histórico, ele expande para a última palavra do comando anterior em história . IOW, a última palavra da entrada anterior na história. Esta palavra é geralmente o último argumento a ser comandado, mas não em caso de redirecionamento. Em:
echo "hello" > /tmp/a.txt
o comando inteiro 'echo "hello" > /tmp/a.txt'
apareceu no histórico e /tmp/a.txt
é a última palavra desse comando.
_
é um parâmetro do shell, ele é expandido para o último argumento do comando anterior. Aqui, o redirecionamento não faz parte dos argumentos passados para o comando, portanto, apenas hello
é o argumento passado para echo
. É por isso que $_
expandiu para hello
.
_
não é mais um dos parâmetros especiais padrão da shell . Ele só funciona em bash
, zsh
, mksh
e dash
quando interativo, ksh93
apenas quando dois comandos estão em linhas separadas:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1