Что значит! #: 3 в командной оболочке

29

Руководство по установке ack предлагает установить скрипт ack с помощью этой команды:

curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 

Я предполагаю, что !#:3в конце это какая-то обратная ссылка, но что это значит? Есть ли эквивалент в Zsh? Гугл не помог.

Мэтт Пфефферле
источник
5
Предполагая Баш; man bash, тогда ищите РАСШИРЕНИЕ ИСТОРИИ
Джефф Шаллер
1
Это значит, что моя кошка очень плохо ходила по клавиатуре.
IQAndreas
@IQAndreas: Ну, это правильная команда, поэтому ваша кошка должна быть достаточно умна, чтобы победить детектора машинного набора . Очевидно, что это не бесполезная кошка. :-) ⁠
G-Man говорит: «Восстановите Монику»

Ответы:

32

Это специальный синтаксис, расширенный с помощью bash. Это также работает для Zsh.

Согласно странице справки bash (раздел РАСШИРЕНИЕ ИСТОРИИ), шаблон расширяется следующим образом:

  • Указатель события !# относится ко всей набранной командной строке, котораяcurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :разделяет между указателем события (в данном случае всей строкой) и указателем слова (выбирает часть)
  • в этом случае указатель слова, 3 который выбирает третье слово / аргумент (отсчет слов начинается с нуля) ~/bin/ack.

В последней командной строки (обычно отображается перед казнены) является: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Подробности смотрите в руководстве по bash или очень похоже на руководство по zsh.

jofel
источник
7
Я не могу не задаться вопросом: кто думал, что эта функция будет хорошей идеей?
Рифмоид
3
@Rhymoid, я не использую !#много, но !!, !$, !*, !sud:pи многие другие все чрезвычайно полезны , и я использую их все время. Проверьте unix.stackexchange.com/a/67/135943
Wildcard
11

Во-первых bash, это подстановка истории (все подстановки истории начинаются с !). В частности, !#до сих пор означает все в командной строке, а добавление «: 3» означает третье слово (отсчет начинается с 0).

Таким образом, приведенная выше команда переводит !#:3в ~/bin/ack.

Брайан
источник