![bash 中 cd 的通配符自动补全](https://linux22.com/image/90682/bash%20%E4%B8%AD%20cd%20%E7%9A%84%E9%80%9A%E9%85%8D%E7%AC%A6%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8.png)
在 ubuntu (debian jessie/sid) 上使用 bash 我不知道为什么我不能完成通配符的 Tab 补全使用内置命令。
例如,假设我当前的工作目录包含以下子目录。
% ls -l
drwxr-xr-x 2 userX 4096 2016-08-31 11:46:40 0830a/
drwxr-xr-x 2 userX 4096 2016-08-31 11:46:52 0830b/
drwxr-xr-x 2 userX 4096 2016-08-31 11:47:33 0831a/
drwxr-xr-x 2 userX 4096 2016-08-31 11:47:18 0831b/
drwxr-xr-x 2 userX 4096 2016-08-31 11:50:38 z0830z/
我可以在输入“ls -l *31a”后点击 [tab] 并完成完成。
ls -l *31a<tab>
完成到..
ls -l 0831a
但是,如果我尝试使用内置“cd”命令执行相同操作,它将无法完成。
cd *31a<tab>
..不会完成
此外,使用尾随通配符也会失败。
cd z*<tab>
..不会完成
有趣的是,没有通配符的补全对于内置函数来说是可以正常工作的。例如,我可以使此完成工作正常:
cd z<tab>
已完成至..
cd z0830z/
此外,我可以按原样使用“cd *31a”命令并使其成功(只要它是唯一的)。但我希望扩展能够发生,这样我就可以确定我要进入的内容。
我的 .inputrc 包含这个..
$if Bash
Space: magic-space
set mark-directories on
set mark-symlinked-directories on
set completion-ignore-case off
set show-all-if-ambiguous on
$endif
我没有 ~/.bash_completion 文件。我确实有 /etc/bash_completion,它只提供 /usr/share/bash-completion/bash_completion 的源。后一个文件有点长,所以我不会将其包含在这里。
我的最终目标是能够为 cd 命令提供通配符补全工作。
答案1
我正在与同样的问题作斗争。正如 @Gilles 提到的,目前还没有真正的基于 bash 的解决方案。
由于bash-completion
并没有真正添加太多功能cd
(据我所知仅使用$CDPATH
目录),因此如果您不使用它,那么您可以将其添加到您的~/.bashrc
:
compopt -o bashdefault cd
这会将完成的行为重置cd
为默认值(通配符完成有效),并且不会更改任何其他内容。