假设我有一个像这样的目录:
foo/
bar.js
bar/
如果我cd
进入 foo 然后输入“ba”然后点击选项卡,我将无法完成,因为文件名与文件夹重叠。
是否有一个我可以用选项卡按住的键,它只会给我文件夹(或文件?)
答案1
TL,DR:添加. /etc/bash_completion
到您的.bashrc
.
为了回答您提出的确切问题,没有这样的内置命令。 bash 有命令完成各种类型的对象(文件名、用户名、变量名等),但不限于目录。
但是,除非您运行的是 bash 的古董版本,否则您可以使用上下文相关的完成,这是 2000 年发布的 2.04 版本中添加的功能。一些发行版默认启用它;对于其他人,您需要安装bash-completion
打包并在您的~/.bashrc
.大多数发行版提供了一个名为 的包bash-completion
并将激活脚本放入其中/etc/bash_completion
,即您.bashrc
应该包含以下行
. /etc/bash_completion
此后,如果您输入cd
并按Tab,则只会完成目录名称。
如果你有一个非古老版本的bash(≥4.0),你可以输入shopt -s autocd
你的.bashrc
,然后你可以省略该cd
命令,这样你就可以只写bar
而不是cd bar
.制表符补全将在该行的第一个单词上补全$PATH
当前目录中的命令名称和目录名称(以及)。$CDPATH
Bash 4.0 还允许您编写自己的命令行版本函数(早期版本也可以,但您必须跳过障碍)。所以如果你真的想要你可以这样做。如何自定义 Bash 命令补全?有一个相对复杂的例子;搜索READLINE_LINE
并complete
找到其他示例。
答案2
键入后没有得到任何补全的原因ba
是因为您没有ba
在cd
命令前面输入命令。 Bash 意识到输入bar.js<ENTER>
和键入都没bar<ENTER>
有意义(一个是目录,而另一个文件bar.js
不在其中$PATH
和/或没有可执行权限集),因此它根本不会给您任何补全。
但是,如果您在目录名称前面加上cd
,bash 将看到bar
合适的内容,而没有其他名称可以看到合适的内容,并且将执行完整的完成:
$ ls
bar bar.js
$ cd <TAB>
此时提示符将转变为
$ cd bar/ # This line