2013-05-25 38 views
2

還有就是compgen -W一些有趣的現象,當我用雙引號內的單引號(看怎麼最後一個參數和輸出指令的不同而不同命令):爲什麼compgen需要在這裏轉義?

$ compgen -W "a\'b1 a\'b2" -- "a'" 
a'b1 
a'b2 
$ compgen -W "a\'b1 a\'b2" -- "a'b" 
$ compgen -W "a\'b1 a\'b2" -- "a\'b" 
a'b1 
a'b2 

爲什麼第三命令需要\一個'前獲得完成選項,但第一個命令不?在調試我的完成腳本時花了幾個小時才發現這個事實。這是一個錯誤,還是有任何解釋爲什麼它必須以這種方式工作?

回答

3

這是因爲compgen處理目標中的引號字符和轉義字符的方式。實際上,它對完成可能意味着非常字面的看法。

讓我們考慮像第一種情況,但如果可能的話沒有任何特殊字符:

ab1 
ab2 

在bash,你可以在以下任一方式輸入第一的這些話(除其他外):

ab1 
a'b'1 
a''b1 
a'b1' 

因此,無論ab1ab2a'可能的完成。這就是compgen返回的結果。

現在,讓我們回到實際的目標,在這個問題:

a'b1 
a'b2 

其中第一個可以在任一方式輸入(其中包括):

a\'b1 
a''\'b1 

但不能打字是這樣的:

a'\''b1 

所以以下所有可以完成任一目標:

a 
a' 
a\ 

但無法進行以下

a'b