Otázka se týká speciálních proměnných. Dokumentace říká:
!!:$označuje poslední argument předchozího příkazu . Toto může
být zkráceno na!$.
(
$_, podtržítko.) Při spuštění shellu nastavte absolutní cestu použitou k vyvolání shellu nebo skriptu shellu, který se provádí tak, jak je předán v
prostředí nebo seznamu argumentů. Následně se rozvine na poslední argument předchozího příkazu po expanzi. Nastavte také na úplnou cestu použitou k vyvolání každého příkazu provedeného a umístěného v prostředí
exportovaném do tohoto příkazu.
Musí tam být nějaký rozdíl, který nedokážu zachytit, protože:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Jaký je rozdíl?
Přijatá odpověď:
!$ je slovní označení rozšíření historie, expanduje na poslední slovo předchozího příkazu v historii . IOW, poslední slovo předchozího záznamu v historii. Toto slovo je obvykle posledním argumentem pro příkaz, ale ne v případě přesměrování. V:
echo "hello" > /tmp/a.txt
celý příkaz 'echo "hello" > /tmp/a.txt' se objevil v historii a /tmp/a.txt je poslední slovo tohoto příkazu.
_ je parametr shellu, expanduje na poslední argument předchozího příkazu. Zde přesměrování není součástí argumentů předávaných příkazu, takže pouze hello je argument předaný do echo . Proto $_ rozšířeno na hello .
_ již není jedním ze standardních speciálních parametrů shellu. Funguje v bash , zsh , mksh a dash pouze když je interaktivní, ksh93 pouze když jsou dva příkazy na samostatných řádcích:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1