为什么compgen需要逃离这里?

时间:2013-05-25 20:38:38

标签: bash bash-completion

当我在双引号内使用单引号时,compgen -W有一些有趣的行为(看看最后一个参数和输出与命令的不同之处):

$ 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

为什么第三个命令在\之前需要'才能获得完成选项,但第一个命令却没有?调试完成脚本时,我花了好几个小时才发现这个事实。这是一个错误,还是有任何解释为什么它必须以这种方式工作?

1 个答案:

答案 0 :(得分:3)

这是因为compgen处理目标中的引号字符和转义字符的方式。实际上,它完全可能意味着完全可能意味着什么。

让我们考虑类似第一种情况,但可能的单词没有任何特殊字符:

ab1
ab2

在bash中,您可以通过以下任何方式(以及其他方式)键入第一个单词:

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

因此,ab1ab2都是a'的可能完成。这就是compgen返回的内容。

现在,让我们回到问题中的实际目标:

a'b1
a'b2

其中第一种可以用以下任何一种方式输入:等等:

a\'b1
a''\'b1

但不能像这样打字:

a'\''b1

所以以下所有目标都可以完成:

a
a'
a\

但以下不能

a'b