A questão é sobre variáveis especiais. A documentação diz:
!!:$
designa o último argumento do comando anterior . Isso pode ser reduzido para! $.
(
$_
, um sublinhado.) Na inicialização do shell, defina o nome do caminho absoluto usado para chamar o shell ou script de shell sendo executado conforme passado na lista de ambiente ou argumento. Posteriormente, expande para o último argumento para o comando anterior após a expansão. Defina também o nome do caminho completo usado para chamar cada comando executado e colocado no ambiente exportado para esse comando.
Deve haver alguma diferença que não consigo captar, porque:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Qual é a diferença?
bash
shell
history-expansion
Tear
fonte
fonte
$_
. Isso é crucial. Pode não explicar a diferença que o intriga, mas explica várias outras maneiras$_
e!$
não são as mesmas.Respostas:
!$
é um designador de palavras da expansão da história, ele se expande para a última palavra do comando anterior na história . IOW, a última palavra da entrada anterior na história. Essa palavra geralmente é o último argumento a ser comandado, mas não no caso de redirecionamento. Em:todo o comando
'echo "hello" > /tmp/a.txt'
apareceu na história e/tmp/a.txt
é a última palavra desse comando._
é um parâmetro do shell, ele se expande para o último argumento do comando anterior. Aqui, o redirecionamento não faz parte dos argumentos passados para o comando, apenashello
o argumento é passado paraecho
. É por isso que$_
expandido parahello
._
não é mais um dos parâmetros especiais padrão do shell . Ele funciona embash
,zsh
,mksh
edash
somente quando interativa,ksh93
somente quando dois comandos estão em linhas separadas:fonte
!$
expansão vs$_
parâmetro é queecho $_
sempre aparece no histórico comoecho $_
, enquantoecho !$
mostra o valor para o qual foi expandido. Por exemploecho one two
, em seguidaecho !$
, em seguida, pressionando-se mostrasecho two
.