当我在双引号内使用单引号时,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
为什么第三个命令在\
之前需要'
才能获得完成选项,但第一个命令却没有?调试完成脚本时,我花了好几个小时才发现这个事实。这是一个错误,还是有任何解释为什么它必须以这种方式工作?
答案 0 :(得分:3)
这是因为compgen
处理目标中的引号字符和转义字符的方式。实际上,它完全可能意味着完全可能意味着什么。
让我们考虑类似第一种情况,但可能的单词没有任何特殊字符:
ab1
ab2
在bash中,您可以通过以下任何方式(以及其他方式)键入第一个单词:
ab1
a'b'1
a''b1
a'b1'
因此,ab1
和ab2
都是a'
的可能完成。这就是compgen
返回的内容。
现在,让我们回到问题中的实际目标:
a'b1
a'b2
其中第一种可以用以下任何一种方式输入:等等:
a\'b1
a''\'b1
但不能像这样打字:
a'\''b1
所以以下所有目标都可以完成:
a
a'
a\
但以下不能
a'b