ack-grep安装脚本中不熟悉的shell语法

sam*_*hen 5 bash shell install ack

从ack安装页面(http://betterthangrep.com/install/)有一个带卷曲的单线安装:

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

我知道它从网站上获取文件并将其保存到〜/ bin/ack,然后设置权限,但最后一部分(!#:3)的作用是什么?(我不认识语法和谷歌搜索没有产生任何有用的结果)

Jam*_*at7 6

请参阅man bash中名为HISTORY EXPANSION的部分,尤其是Word Designators子部分. !#:3指的是管道的第三个字,(在你的例子中)~/bin/ack.按顺序,命令的字是curl0; http://betterthangrep.com/ack-standalone,1; >,2; ~/bin/ack,3; &&,4; chmod,5; 0755,6; !#:3,也就是说,这是!#:3一种在不使用单独的变量或文字文本的情况下重复文件名的方法.

关于关于>和空白的问题,请注意这>是一个元字符,人类bash将其定义为"在没有引用时将字分开的字符".以下之一:| &; ()<>空格标签".因此,空格不会影响是否>计为令牌.但请注意,在下面的示例中,3引用了第一个,以便bash不会将其解释为3>重定向的一部分.输入行时,bash回显扩展行,然后执行它.

$ seq '3'>bbb;cat !#:3 !#:2 ccc; head !#:3 !#:8
seq '3'>bbb;cat bbb > ccc; head bbb ccc
==> bbb <==
1
2
3

==> ccc <==
1
2
3
Run Code Online (Sandbox Code Playgroud)

  • @AndyLester,也看到了添加的例子 (2认同)