假设我在这样的目录中:
:我的目录$ ls
foo.txt
那唯一的文件。如果我键入类似的命令cat
,然后按 Tab 键自动完成(假设 ‸ 字符实际上是插入符号位置,而不是用于此目的的字符)...
:mydirectory$ 猫 ‸
更改为(再次强调:这里的 ‸ 不是字符而是插入符号)...
:mydirectory$ cat foo.txt ‸
但对于这样的命令来说就不一样了:
:我的目录$ tar ‸
当我点击选项卡时,我会看到自动完成的选项:
A c d r t u x
当写这样的东西时:
:mydirectory$ tar -zxvf ‸
然后什么都不会自动完成。
我的问题是:许多命令如何更改 bash 中的自动完成规则?
答案1
命令不会更改自动完成规则。自动完成规则是使用脚本和函数为 shell 定义的,并在 shell 启动时加载。我将使用它bash
作为示例,因为我比其他 shell 更熟悉它。
自动完成 in 的规则bash
在 in 脚本中定义/etc/bash_completion
,并由目录中的其他脚本补充/etc/bash_completion.d/
。这些规则是bash
在您登录时获取的。
bash
有一个complete
命令可以让您轻松定义完成规则。要查看已定义的所有规则,您可以运行complete -p
.
现在,大多数发行版已经为您定义了这些规则。因此,当您键入 时tar <TAB>
,您的发行版已经定义了一条规则,用于将与模式*.tar*
和tar
命令选项匹配的文件显示为自动完成建议。这就是为什么当您键入 时tar
,它会为您提供选项A c d r t u x
,但对于tar -zvxf
,它不会为您提供选项,因为之后就没有其他选项了。现在,如果您在该目录中输出一个.tar.gz
文件,它会建议将其作为自动完成选项,因为该f
选项之后的下一个内容是 tar 文件。
默认情况下/etc/bash_completion
不提供选项作为建议,也不过滤文件类型。在这种情况下,您还将看到该foo.txt
文件作为对 的建议tar
。
您可以在此处阅读有关创建自己的规则的信息 -https://debian-administration.org/article/316/An_introduction_to_bash_completion_part_1和https://debian-administration.org/article/317/An_introduction_to_bash_completion_part_2