La domanda riguarda le variabili speciali. La documentazione dice:
!!:$
designa l'ultimo argomento del comando precedente . Questo può
essere abbreviato in !$ .
($_ , un carattere di sottolineatura.) All'avvio della shell, impostare il percorso assoluto utilizzato per richiamare la shell o lo script della shell eseguito come passato nell'ambiente
o nell'elenco di argomenti. Successivamente, si espande all'ultimo argomento del comando precedente dopo l'espansione. Imposta anche il percorso completo utilizzato per richiamare ogni comando eseguito e inserito nell'ambiente
esportato in quel comando.
Ci deve essere qualche differenza che non riesco a cogliere, perché:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Qual è la differenza?
Risposta accettata:
!$ è una parola che designa l'espansione della cronologia, si espande all'ultima parola del comando precedente nella storia . IOW, l'ultima parola della voce precedente nella storia. Questa parola è solitamente l'ultimo argomento da comandare, ma non in caso di reindirizzamento. In:
echo "hello" > /tmp/a.txt
l'intero comando 'echo "hello" > /tmp/a.txt' è apparso nella cronologia e /tmp/a.txt è l'ultima parola di quel comando.
_ è un parametro della shell, si espande all'ultimo argomento del comando precedente. Qui, il reindirizzamento non fa parte degli argomenti passati al comando, quindi solo hello è l'argomento passato a echo . Ecco perché $_ esteso a hello .
_ non è più uno dei parametri speciali standard della shell. Funziona in bash , zsh , mksh e dash solo quando interattivo, ksh93 solo quando due comandi sono su righe separate:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1