bash选项卡补全如何工作?


113

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


2
您可能要检查一下/etc/bash_completion(至少,这是Debian中很多魔术的地方)。
2011年

1
@Wrikken:那是bash_completion,它取决于制表符的完成,但不完全取决于它的发生方式。
伊格纳西奥·巴斯克斯

Answers:


100

自动补全分为两部分:

  • 正如fixje所提到的,readline库管理命令行编辑,并在按下Tab键时回调回bash以启用完成功能。然后Bash给出(请参阅下一点)可能完成的列表,并且readline插入尽可能多的字符,这些字符已由已经键入的字符明确标识。(您可以配置readline库很多,请参阅Bash的命令行编辑部分详细信息。)

  • Bash本身具有内置功能,complete可以为单个命令定义完成机制。如果当前命令未定义任何内容,则按文件名使用补全(如Ignacio所述,使用opendir / readdir)。

    可编程完成部分中描述了定义您自己的完成的零件。简而言之,用 complete «options» «command»您定义一些命令的完成。例如complete -u su当完成一个参数时su命令,搜索当前系统的用户

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

您可以使用简单地列出在当前bash环境中定义的现有补全complete,以对可能的结果产生印象。如果您安装了bash-completion软件包(或者在系统上命名为bash),则会安装许多命令的完成内容,并且正如Wrikken所说的那样,/etc/bash_completion包含一个bash脚本,然后通常在外壳启动时执行以配置它。其他自定义完成脚本可以放在/etc/bash_completion.d; 中。这些都来自于/etc/bash_completion


1
手册页仅用于独立命令,而不用于shell内置程序。但这是我链接的bash手册的一部分。
圣保罗Ebermann

7

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.