#:3在shell命令中是什么意思


29

ack的安装指南建议使用以下命令安装ack脚本:

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

我认为!#:3最后的是某种反向引用,但这意味着什么?zsh中是否有等效项?Google并没有帮助。


5
假设重击;man bash,然后搜索“历史扩展”
杰夫·谢勒

1
这意味着我的猫在非常糟糕的时候走过键盘。
IQAndreas

@IQAndreas:嗯,这是一个有效的命令,所以您的猫必须足够聪明才能击败猫打字检测器。显然,这不是一只没用的猫。:-)⁠–
G-Man说'

Answers:


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手册非常相似的手册。


7
我禁不住想:谁认为此功能会是一个好主意?
Rhymoid

3
@Rhymoid,我不使用!#太多,但是!!!$!*!sud:p和许多其他人都是非常有用的,我用他们所有的时间。退房unix.stackexchange.com/a/67/135943
通配符

11

在中bash,它是历史记录替换(所有历史记录替换都以开头!)。具体来说,!#表示到目前为止命令行上的所有内容,加号':3'表示第三个单词(从0开始计数)。

因此,以上命令将转换!#:3~/bin/ack

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.