Что такое доллар доллара (! $) В Bash?

Взрывный доллар, похоже, относится к последней части последней командной строки.

например.

$ ls -l
 .... something
$ !$
-l
bash: -l command not found

Я могу найти много на долларовых переменных (например, $!), но не на этом. Любое объяснение?

Ответ 1

Это последний аргумент предыдущей команды. Из документации:

!!:$

обозначает последний аргумент предыдущей команды. Это может быть сокращено до !$.

Примечание. Если вы хотите поиграть с историей Bash, я предлагаю вам включить параметр оболочки histverify следующим образом:

shopt -s histverify

(вы также можете поместить его в свой .bashrc, чтобы он был включен). При использовании замены истории замена не выполняется немедленно; вместо этого он помещается в буфер чтения, ожидая нажатия клавиши ввода... или нет!


Чтобы сделать что-то точным, набрав !$ не эквивалентно типу "$_": !$ - это действительно замена истории, ссылающаяся на последнее слово предыдущей команды, которая была введена, тогда как "$_" является последним аргумент ранее выполненной команды. Вы можете сравнить оба (у меня есть shopt -s histverify):

$ { echo zee; }
zee
$ echo "$_"
zee
$ { echo zee; }
zee
$ echo !$
$ echo }

также:

$ if true; then echo one; else echo two; fi
one
$ echo "$_"
one
$ if true; then echo one; else echo two; fi
$ echo !$
$ echo fi

А также:

$ echo zee; echo "$_"
zee
zee
$ echo zee2; echo !$
$ echo zee2; echo "$_"

А также

$ echo {1..3}
1 2 3
$ echo "$_"
3
$ echo {1..3}
1 2 3
$ echo !$
$ echo {1..3}

А также

$ echo one ;
$ echo "$_"
one
$ echo one ;
one
$ echo !$
$ echo ;

Есть много других примеров, например, с псевдонимами.

Ответ 2

!$ может делать то, что $_ делает, за исключением того факта, что $_ не сохраняет значение, которое он возвращает "это substitution" в истории.

Вот пример.

С !$

za:tmep za$ ls -lad 
drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
za:tmep za$ !$
-lad
-bash: -lad: command not found
za:tmep za$ history | tail -n 3
  660  ls -lad 
  661  -lad                     <<== history shows !$ substitution.  
  662  history | tail -n 3

С $_

za:tmep za$ ls -lad
drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
za:tmep za$ $_
-bash: -lad: command not found
za:tmep za$ history | tail -n 3
  663  ls -lad
  664  $_         <<== history shows $_ and not its substitution. 
  665  history | tail -n 3
za:tmep za$ 

Дополнительные параметры:

!^      first argument
!:2     second argument
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments
!:2-3   second to third arguments
!$      last argument
!*      all arguments