2013-05-25 120 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