Pytanie dotyczy zmiennych specjalnych. Dokumentacja mówi:
!!:$
wyznacza ostatni argument poprzedniego polecenia . Można to skrócić do! $.
(
$_
podkreślenie.) Przy uruchamianiu powłoki ustaw bezwzględną nazwę ścieżki używaną do wywoływania powłoki lub skryptu powłoki wykonywanej tak, jak przekazano w środowisku lub liście argumentów. Następnie rozwija się do ostatniego argumentu do poprzedniego polecenia po rozwinięciu. Ustawiono również na pełną ścieżkę używaną do wywoływania każdego wykonanego polecenia i umieszczanego w środowisku eksportowanym do tego polecenia.
Musi być jakaś różnica, której nie mogę złapać, ponieważ:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
Jaka jest różnica?
bash
shell
history-expansion
Warsztat tkacki
źródło
źródło
$_
$_
!$
Odpowiedzi:
!$
jest słowem oznaczającym ekspansję historii, rozwija się do ostatniego słowa poprzedniego polecenia w historii . IOW, ostatnie słowo poprzedniego wpisu w historii. To słowo jest zwykle ostatnim argumentem do polecenia, ale nie w przypadku przekierowania. W:całe polecenie
'echo "hello" > /tmp/a.txt'
pojawiło się w historii i/tmp/a.txt
jest ostatnim słowem tego polecenia._
jest parametrem powłoki, rozwija się do ostatniego argumentu poprzedniego polecenia. Przekierowanie nie jest tutaj częścią argumentów przekazywanych do polecenia, więchello
przekazywany jest tylko argumentecho
. Właśnie dlatego został$_
rozszerzony dohello
._
nie jest już jednym ze standardowych parametrów specjalnych powłoki . To działa wbash
,zsh
,mksh
idash
tylko wtedy, gdy interaktywne,ksh93
tylko wtedy, gdy dwa polecenia są na oddzielnych liniach:źródło
!$
interpretacji vs$_
parametru jest to, żeecho $_
zawsze pokazuje się w historii jakoecho $_
, aecho !$
pokazuje wartość, do której został rozwinięty. Np.echo one two
Następnieecho !$
naciśnięcie przycisku pokazujeecho two
.