我最近花了很多时间在 shell 中,我想知道选项卡自动完成是如何工作的。它背后的机制是什么?Bash 如何知道每个目录的内容?
如果你对基本的东西感兴趣: Bash 使用具有历史和基本完成功能的 读数线。如果你想得到一个详细的了解,你可以检查来源。 此外,您可以使用 readline 在完成时构建自己的 CLI 接口
自动补全包括两个部分:
正如 fixje 已经提到的,readline 库管理命令行编辑,并在按下 tab 时调用 bash,以启用完成。然后,Bash 给出(参见下一点)一个可能的完成列表,readline 插入的字符数量与已键入的字符明确标识的字符数量相同。(您可以对 readline 库进行相当多的配置,有关详细信息,请参阅 Bash 手册的 命令行编辑部分。)
Bash 本身具有内置的 complete,用于为各个命令定义完成机制。如果当前命令没有定义任何内容,则使用按文件名完成(如 Ignacio 所说,使用 opendir/readdir)。
complete
定义您自己的完成的部分在 可编程完成小节中进行了描述 你定义了一些命令的完成。例如 complete -u su说 当完成 su命令的参数时,搜索当前系统 的用户。
complete -u su
su
如果这比 普通选项可以覆盖(例如,根据参数索引或根据以前的参数不同的完成) , 您可以使用 -F function,然后它将调用一个 shell 函数来生成可能的完成列表。 (例如用于 git 完成,这是非常复杂的,取决于子命令,有时 在给定的选项上,并且有时使用分支的名称(bash 不知道这些名称)
-F function
您可以使用简单的 complete列出在当前 bash 环境中定义的现有完成项,以便了解可能发生的情况。如果你已经安装了 bash 完成包(或者在你的系统上命名它) ,就会安装很多命令的完成,正如 Wrikken 所说,/etc/bash_completion包含一个 bash 脚本,然后通常在 shell 启动时执行这个脚本来配置它。额外的自定义完成脚本可以放置在 /etc/bash_completion.d中; 这些脚本都来源于 /etc/bash_completion。
/etc/bash_completion
/etc/bash_completion.d