2012-10-14 45 views
5

从Ack安装页面(http://betterthangrep.com/install/)有一个班轮安装的卷曲度:不熟悉shell语法安装脚本

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

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

+3

我是betterthangrep.com的维护者,我甚至不知道它做了什么,除非知道它的工作。谢谢你问我有人提交给我时应该问什么。 :) –

+1

请不要使用像“[预先感谢!”](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from -posts)。并且不要将它们添加到其他人的帖子中。 – NullUserException

回答

6

请参阅人称击中的历史扩展部分,特别是字指示符子部分。 !#: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 
+0

是根据意义还是空白符号化的?如果它是'curl url> file',现在会有两个字还是四个? –

+0

它根据空白标记。计数从零开始,所以'curl'为0,URL 1,重定向操作符2和文件3. – chepner

+2

@AndyLester,也可以看到添加的示例 –

3

!#意味着要执行的命令为止所输入的,但你可以:n指定的参数。 :0将是第一个字(curl),:1第二个(http...)等。