我在 ubuntu 18.04 上的 gnome-terminal 3.28.2 中使用 bash 4.4.19。
我在控制台中遇到了目录变量的制表符补全问题,这似乎可以通过以下方法解决
shopt -s direxpand
shopt -s cdable_vars
FOO
假设我在 .bashrc 中定义了一个包含某些路径的变量:export FOO=/some/valid/path
将它与 结合起来cd
,我得到以下行为:
$ cd $FOO + [Tab] # nothing happens
$ cd $FOO/ + [Tab] # expands to /some/valid/path
到目前为止一切顺利。
但是,当使用它时ls
,第一次扩展后会出现一个空格:
$ ls $FOO + [Tab] # I'm writing the results on the next line
$ ls $FOO[Space]
这很烦人。
在网上搜索解决方案一直无果;之前在 stackexchange 页面上也问过类似的问题,但没有解决方案:
此链接建议修改文件 /etc/bash_completion.d/acroread.sh
,但我没有该文件,或者
编辑 /etc/bash_completion 第 1587 行,将默认值更改为文件名(先进行备份)。
但在我的机器上,该文件中没有'default'
该行。同样适用于发布的解决方案这个问题。
这个问题的答案还说这个错误应该在 bash 4.3 中得到修复,但它不适用于我的 bash 4.4
答案1
在我的 Kubuntu 中我可以执行以下操作:
$ compopt cd
compopt +o bashdefault +o default +o dirnames +o filenames -o nospace +o plusdirs cd
$ compopt ls
compopt +o bashdefault +o default +o dirnames +o filenames +o nospace +o plusdirs ls
$
如您所见, 有-o nospace
(选项已启用)cd
但+o nospace
有 (选项已禁用) ls
。为了使其在制表符补全后添加空格时的ls
行为类似,我运行以下命令:cd
compopt -o nospace ls
手动运行它并检查它是否解决了问题。要永久更改选项,请将命令放在命令末尾~/.bashrc
,这样每个新的交互式 Bash 会话都会自动运行它。无需 root 访问权限,也不需要系统范围的补丁。