2

当我在双引号内使用单引号时,有一些有趣的行为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

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

4

1 回答 1

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
于 2013-05-26T00:29:27.920 回答