我注意到,当我输入unzip
bash 并按标签,自动完成功能仅适用于扩展名为 .zip 的文件。这是怎么做到的?如果我想制作只接受图像文件的程序,如何将自动完成限制为某些扩展名(例如仅 .jpg 和 .png)。
这是某种系统设置还是因语言(bash、C++、python)而异的编程设置?
答案1
程序本身运行传递给它的任何文件名。对完成后缀的限制.zip
与程序的功能无关。完成由 shell 执行。当您按下 时Tab,shell 会在某种程度上解析命令行,查找上下文的完成规则。根据 shell,上下文分析和完成规则可能或多或少复杂。例如,当命令行包含echo $P
并且您按 时Tab,大多数具有完成功能的 shell 都会查找以 开头的变量名称P
。默认情况下,shell 会完成文件名,因为这是很常见的情况。
Bash、tcsh 和 zsh 有办法使完成过程可编程:它们解析光标下的命令,并在表中查找该特定命令的规则。通过可编程完成,程序表中的条目unzip
应该表明第一个参数必须是现有.zip
文件,后续参数必须是 zip 存档成员的名称。
完成规则不包含在程序本身中,但它们可以与程序一起在同一包中提供。例如,包含命令的包/usr/bin/foo
可以包含一个/etc/bash_completion/foo
描述 bash 如何完成命令参数的文件,以及zsh 的foo
类似文件。/usr/share/zsh/functions/Completion/_foo
答案2
Bash 命令行补全可通过 bash 脚本进行自定义。在 Gentoo Linux 中,您可以使用命令轻松管理您想要启用的完成功能eselect bashcomp
。启用后,系统范围脚本的符号链接将在您的~/.bash_completion.d/
目录中创建。您可以使用此脚本作为第一个资源来了解如何使用 bash 完成自动完成。