bash选项卡完成如何工作?

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

自动完成有两个部分:

  • 正如fixje已经提到的,readline库pipe理命令行编辑,并在按下tab键时callbackbash,以启用完成。 然后,Bash给出(参见下一个点)可能的完成列表,并且readline将插入尽可能多的字符,这些字符是由已经input的字符明确标识的。(您可以非常详细地configurationreadline库,请参阅Bash 命令行编辑部分手册的细节。)

  • Bash本身已经完成了为单个命令定义完成机制的构build。 如果没有定义当前命令,则使用文件名完成(使用opendir / readdir,如Ignacio所述)。

    可编程完成部分描述了定义自己的完成部分。 简而言之,通过complete «options» «command»您可以定义某个命令的完成。 例如complete -u su表示在完成su命令的参数时,search当前系统的用户

    如果这比正常的选项可以覆盖的更复杂(例如,根据参数索引或取决于先前的参数的不同完成),则可以使用-F function ,然后调用shell函数来生成可能的完成列表。 (这是用于git完成,这是非常复杂的,取决于子命令,有时在给定的选项,有时使用分支的名称(这是什么bash知道)。

您可以使用简单的complete列出在当前bash环境中定义的现有完成,以便对可能的情况有一个印象。 如果安装了bash-completion软件包(或者在您的系统上已经命名),那么会安装大量命令的完成,正如Wrikken所说,/ etc / bash_completion包含一个bash脚本,该脚本通常会在shell启动时执行configuration这个。 额外的自定义完成脚本可以放在/etc/bash_completion.d; 这些都来自/ etc / bash_completion。

如果您对基础知识感兴趣:Bash使用readline ,其中包含历史logging和基本完成。 如果你想得到详细的理解,你可以检查来源。 而且,你可以使用readline来完成你自己的CLI接口