![如何设置 bash 自动完成来处理诸如“./foo=bar/x=y.txt”之类的文件名?](https://linux22.com/image/1055137/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%20bash%20%E8%87%AA%E5%8A%A8%E5%AE%8C%E6%88%90%E6%9D%A5%E5%A4%84%E7%90%86%E8%AF%B8%E5%A6%82%E2%80%9C.%2Ffoo%3Dbar%2Fx%3Dy.txt%E2%80%9D%E4%B9%8B%E7%B1%BB%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%9F.png)
当我开始输入包含等号的文件名时,使用 [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现在将正确扩展文件名。