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

Mat*_*rle 29 bash command-history

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

curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 
Run Code Online (Sandbox Code Playgroud)

我认为!#:3最后是某种反向引用,但它是什么意思?zsh 中是否有等价物?谷歌没有帮助。

jof*_*fel 33

这是一种特殊的语法,由 bash 扩展。它也适用于 zsh。

根据 bash 手册页(部分 HISTORY EXPANSION),模式扩展如下:

  • 事件标志 !#是指迄今输入的整个命令行是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 手册

  • 我不禁想知道:谁认为这个功能会是个好主意? (8认同)
  • @Rhymoid,我不经常使用`!#`,但是`!!`、`!$`、`!*`、`!sud:p` 和许多其他东西都非常有用,我一直在使用它们. 查看 http://unix.stackexchange.com/a/67/135943 (3认同)

Bri*_*ian 11

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

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