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



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

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

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

请参阅man bash中名为"历史扩展"的部分,特别是单词指示符小节。 !#: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

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

最新更新