$ _ vs! $. Último argumento do comando anterior e redirecionamento de saída


28

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?


4
! $ é a expansão do histórico, não uma variável especial, portanto, eu presumo que o código bash lida com eles de maneira diferente.
Jeff Schaller

2
Não tenho uma resposta definitiva para essa pergunta, mas: language A linguagem shell Bourne é uma das, talvez a linguagem de programação menos consistente internamente, ainda hoje amplamente utilizada. Tentar deduzir princípios gerais não levará a lugar algum. Você apenas tem que memorizar todas as regras especiais. Desculpe. ② Observe as palavras "após expansão", imediatamente após a frase que você destacou, na definição de $_. 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.
Zwol 23/03

Respostas:


32

!$é 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:

echo "hello" > /tmp/a.txt

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, apenas helloo argumento é passado para echo. É por isso que $_expandido para hello.

_não é mais um dos parâmetros especiais padrão do shell . Ele funciona em bash, zsh, mkshe dashsomente quando interativa, ksh93somente quando dois comandos estão em linhas separadas:

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1

11
Um efeito da !$expansão vs $_parâmetro é que echo $_sempre aparece no histórico como echo $_, enquanto echo !$mostra o valor para o qual foi expandido. Por exemplo echo one two, em seguida echo !$, em seguida, pressionando-se mostras echo two.
Jacktose
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.