bash 选项卡完成如何工作?

Posted

技术标签:

【中文标题】bash 选项卡完成如何工作?【英文标题】:How does bash tab completion work? 【发布时间】:2011-07-31 01:24:22 【问题描述】:

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

【问题讨论】:

您可能想查看/etc/bash_completion(至少,这就是 Debian 的神奇之处)。 @Wrikken:这就是 bash_completion,它依赖于 tab 完成,但并不完全是如何发生的。 在*nix stackexchange上也有几个问题,包括:unix.stackexchange.com/questions/4738/…unix.stackexchange.com/questions/1800/custom-autocompleteunix.stackexchange.com/questions/12356/…和至少一个在SU上:superuser.com/questions/289539/custom-bash-tab-completion 【参考方案1】:

自动完成有两个部分:

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

Bash 本身具有内置的complete 来定义单个命令的完成机制。如果当前命令没有定义任何内容,则它使用文件名完成(使用 opendir/readdir,正如 Ignacio 所说)。

在Programmable Completion 部分中描述了定义您自己的完成的部分。简而言之,与 complete «options» «command» 您定义了某些命令的完成。例如complete -u su在完成su 命令的参数时,搜索当前系统的用户

如果这比 普通选项可以覆盖(例如,根据参数索引或先前参数的不同补全), 您可以使用-F function,然后它会调用一个shell 函数来生成可能的完成列表。 (这用于例如 git 完成,这非常复杂,取决于子命令,有时 在给定的选项上,有时使用分支的名称(bash 对此一无所知)。

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

【讨论】:

手册页仅用于独立命令,不适用于 shell 内置命令。但它是我链接的 bash 手册的一部分。【参考方案2】:

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

【讨论】:

以上是关于bash 选项卡完成如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

sh Bash选项卡完成代码段

markdown Bash-only Laravel Artisan选项卡自动完成

Git选项卡完成在mac上的zsh中不起作用

如何在 bash here-document 中键入选项卡?

如何在同一目录的 Windows 终端中打开一个新的 git-bash 选项卡?

SBT选项卡完成无法在交互模式下工作