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