2012-10-14 71 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...)等。