如何设置 bash 自动完成来处理诸如“./foo=bar/x=y.txt”之类的文件名?

如何设置 bash 自动完成来处理诸如“./foo=bar/x=y.txt”之类的文件名?

当我开始输入包含等号的文件名时,使用 [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现在将正确扩展文件名。

相关内容