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

时间:2012-10-14 18:51:44

标签: bash shell install ack

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

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

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

2 个答案:

答案 0 :(得分:6)

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

关于>和空白的问题,请注意>是一个元字符,man 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

答案 1 :(得分:3)

!#表示执行到目前为止输入的命令,但您可以使用:n指定参数。 :0将是第一个单词(curl),:1是第二个单词(http...),依此类推。