5

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

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

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

4

2 回答 2

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
于 2012-10-14T19:03:12.510 回答
3

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

于 2012-10-14T19:03:37.127 回答