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