$ _ vs! $. Ultimo argomento del comando precedente e reindirizzamento dell'output


28

La domanda riguarda le variabili speciali. La documentazione dice:

!!:$

indica l' ultimo argomento del comando precedente . Questo può essere abbreviato in! $.


( $_, un trattino basso). All'avvio della shell, impostare sul percorso assoluto usato per invocare la shell o lo script della shell in esecuzione come passato nell'ambiente o nell'elenco degli argomenti. Successivamente, si espande all'ultimo argomento al comando precedente dopo l'espansione. Impostato anche sul percorso completo utilizzato per richiamare ogni comando eseguito e inserito nell'ambiente esportato in quel comando.

Dev'esserci 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?


4
! $ è l'espansione della cronologia, non una variabile speciale, quindi suppongo che il codice bash li gestisca in modo diverso.
Jeff Schaller

2
Non ho una risposta definitiva a questa domanda, ma: ① Il linguaggio della shell Bourne è uno dei, forse il linguaggio di programmazione almeno internamente coerenti ancora ampiamente usato oggi. Tentare di dedurre principi generali non ti porterà da nessuna parte. Devi solo memorizzare tutte le regole speciali. Scusate. ② Notare le parole "dopo l'espansione", immediatamente dopo la frase evidenziata, nella definizione di $_. Questo è cruciale. Potrebbe non spiegare la differenza che ti confonde, ma spiega un sacco di altri modi $_e !$non sono gli stessi.
zwol,

Risposte:


32

!$è un designatore di parole dell'espansione della storia, si espande all'ultima parola del comando precedente nella storia . IOW, l'ultima parola della voce precedente nella storia. Questa parola è di solito l'ultimo argomento da comandare, ma non in caso di reindirizzamento. Nel:

echo "hello" > /tmp/a.txt

l'intero comando è 'echo "hello" > /tmp/a.txt'apparso nella storia ed /tmp/a.txtè l'ultima parola di quel comando.

_è un parametro di shell, si espande fino all'ultimo argomento del comando precedente. Qui, il reindirizzamento non fa parte degli argomenti passati al comando, quindi solo hellol'argomento viene passato echo. Ecco perché $_ampliato a hello.

_non è più uno dei parametri speciali standard della shell . Funziona in bash, zsh, mkshe dashsolo quando interattivo, ksh93solo quando due comandi sono su linee separate:

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

$ echo 1
1
$ echo $_
1

1
Un effetto !$dell'espansione vs $_parametro è che echo $_mostra sempre nella storia come echo $_, mentre echo !$mostra il valore in cui è stato espanso. Ad esempio echo one two, allora echo !$, poi premendo su spettacoli echo two.
Jacktose,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.