奇怪的自动完成行为

奇怪的自动完成行为

嗯...我很困惑,因为在我的情况下唯一真正的问题就是该死的撇号(')。
情况:扩展 PATH 变量会影响单词完成,基于附加路径中是否有撇号。
例子:我有一个具有适当 exe 权限的 exe 文件(名为“deadbeef”),其路径包含 2 个撇号:
/home/mallniya/hard'n'soft/soft/gnu-linux/portable/deadbeef-0.6.0
为了进行实验,我将同一个文件放到
/home/mallniya/hardnsoftaa/soft/gnu-linux/portable/deadbeef-0.6.0
如果我将第一个路径导出到变量 $PATH,bash 中将不会自动完成,但在第二种情况下会出现。当我在终端中输入导出目录中程序的首字母时
死的[TAB]
第一种情况下没有完成,但当我在第二种情况下对同一个单词使用 TAB 时 - 它有效。
但如果我在第一种情况下手动输入命令“deadbeef” - 它也会执行。
此外,两者哪个类型命令告诉我们,exe 文件在两种情况下都存在。
那么问题是什么?为什么 bash 会这样处理撇号?

答案1

撇号对于几乎所有 shell 来说都是特殊字符(shell 是指命令行解释器,它是读取您输入的内容并解释相应内容的程序)。

简短回答:不要这样做。与空格一样,最好避免使用具有特殊含义或特殊字符的文件名。

长答案:如果你想使用撇号,你必须“引用“它们(使用特殊字符阻止 shell 解释它们)。自动完成将在需要时自动引用它们...示例:

(0)samsung-romano:~/tmp/try% touch "hard'n'soft"

引用单引号的一种方法是使用双引号。(反之亦然,尽管比这更复杂)。

(0)samsung-romano:~/tmp/try% ls
hard'n'soft

现在如果写入cat hard并按下TAB

(0)samsung-romano:~/tmp/try% cat hard\'n\'soft 

反斜杠是引用以下字符的另一种形式。

答案2

好吧,正如 bash_completion 团队建议的那样,我已将此行为报告给 bash 团队,他们的答复是:
“感谢您的报告。此问题将在 bash-4.3 中修复。”
看起来这个错误已经为人所知,我们应该等待。

答案3

为了扩展带有撇号的路径,请在路径前面添加“。

cd "/home/mallniya/hard

在标签扩展中扩展时没有问题。

相关内容