为什么 Bash 在自动完成文件名时会转义冒号?

为什么 Bash 在自动完成文件名时会转义冒号?

当我按下TabBash 以使其自动完成包含冒号的文件名时,自动完成的结果会转义冒号。例如,从以下内容开始(不执行最后一行),

touch a:b
ls a

我按下Tab,结果是

ls a\:b

但当我直接发出时似乎没有任何影响ls a:b。结果与 相同ls a\:b

那么,Bash 为什么要转义冒号呢?在某些情况下,它是否有特殊含义?

答案1

冒号是 COMP_WORDBREAKS

COMP_WORDBREAKS

Readline 库在执行单词补全时将其视为单词分隔符的字符集。如果未设置 COMP_WORDBREAKS,它将失去其特殊属性,即使随后将其重置也是如此。

正如解释的那样 以冒号开头的完成项

冒号会为补全系统断开单词(查看 COMP_WORDBREAKS shell 变量的描述),因此当您输入

progname :[TAB]

补全系统会得到一个空字来补全。如果所有可能的补全都以“:”作为最长公共前缀,那么补全系统会将冒号插入到行中。

从 COMP_WORDBREAKS 环境变量中删除冒号将解决问题。

例如 Maven 的 Bash 补全转义冒号

相关内容