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

16

A questão é sobre variáveis especiais. Documentação diz:

!!:$

designates the last argument of the preceding command. This may be shortened to !$.

($_, an underscore.) At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list. Subsequently, expands to the last argument to the previous command after expansion. Also set to the full pathname used to invoke each command executed and placed in the environment exported to that command.

Deve haver alguma diferença que não consigo entender 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?

    
por Loom 23.03.2016 / 11:49

1 resposta

17

!$ é 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
    
por 23.03.2016 / 15:13