当我按下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 环境变量中删除冒号将解决问题。