当我开始输入包含等号的文件名时,使用 [tab] 自动完成会显示出奇怪的行为:
ls ./foo[tab] # autocompletion to "./foo\=bar" <- ok
ls ./foo=[tab] # autocompletion to "./foo=foo\=bar/" <- not ok
我可以将某些内容放入 .bashrc 中以控制此行为或更改 /etc 中的某些自动完成脚本吗?
bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
答案1
可能不会。或者,至少,它会非常复杂。这里的问题是,foo=
bash 将 解释为尝试将变量设置foo
为某个值。因此,当您点击时,tab它会尝试使用当前目录中的文件名称来完成。它实际上并没有完成foo=
,而是从零开始一个全新的 glob。请注意,需要两个制表符才能完成foo=
。
为了说明这一点,即使没有以 开头的文件,您也可以看到相同的行为foo=
:
$ ls
bar baz
键入foo=
并按下Tab可得到以下结果:
$ foo= ## first tab does nothing
$ foo=
bar baz ## both file names are printed.
我怀疑是否有任何办法解决这个问题,因为这是 shell 的基本功能和定义变量的主要方法。
我能想到两种解决方法。要么转义=
:
$ ls foo\= ## hit tab
$ ls foo\=bar
或者使用引号:
$ ls 'foo= ## hit tab
$ ls 'foo=bar' ## yes, the final quote is added by the shell.
点击Tab现在将正确扩展文件名。