ChatGPT解决这个技术问题 Extra ChatGPT

bash 选项卡完成如何工作?

我最近在 shell 上花了很多时间,我想知道选项卡自动完成是如何工作的。其背后的机制是什么? bash 如何知道每个目录的内容?

您可能需要检查 /etc/bash_completion(至少,这是 Debian 的许多神奇之处)。
@Wrikken:那是 bash_completion,它取决于制表符完成,但不完全是如何发生的。

S
Seltzer

自动完成有两个部分:

正如 fixje 已经提到的那样,readline 库管理命令行编辑,并在按下选项卡时回调 bash,以启用完成。 Bash 然后给出(见下一点)可能完成的列表,并且 readline 插入尽可能多的字符,这些字符由已经输入的字符明确标识。(您可以配置 readline 库,请参阅 Bash 的命令行编辑部分手册了解详情。)

Bash 本身具有内置的完成功能,可以为各个命令定义完成机制。如果当前命令没有定义任何内容,则它使用文件名完成(使用 opendir/readdir,如 Ignacio 所说)。可编程完成部分中描述了定义您自己的完成的部分。简而言之,使用完整的«选项»«命令»您可以定义某些命令的完成。例如 complete -u su 表示在完成 su 命令的参数时,搜索当前系统的用户。如果这比普通选项可以涵盖的更复杂(例如,不同的完成取决于参数索引,或取决于先前的参数),您可以使用 -F 函数,然后调用一个 shell 函数来生成可能的完成列表。 (例如,这用于 git 完成,这非常复杂,取决于子命令,有时取决于给定的选项,有时还使用分支名称(bash 对此一无所知)。

您可以简单地使用 complete 列出当前 bash 环境中定义的现有完成,以了解可能的情况。如果您安装了 bash-completion 包(或者它在您的系统上命名),则会安装许多命令的完成,并且正如 Wrikken 所说,/etc/bash_completion 包含一个 bash 脚本,然后通常在 shell 启动时执行该脚本以配置这个。可以在 /etc/bash_completion.d 中放置其他自定义完成脚本;这些都来自/etc/bash_completion


手册页仅适用于独立命令,不适用于 shell 内置命令。但它是我链接的 bash 手册的一部分。
A
Abhinav Shrivastava

如果您对基础知识感兴趣:Bash 使用具有历史记录和基本补全功能的 readline。如果您想详细了解,可以检查源代码。此外,您可以使用 readline 构建您自己的 CLI 界面并完成