我最近花了很多时间在shell中,我想知道选项卡自动完成是如何工作的。它背后的机制是什么? bash如何知道每个目录的内容?
答案 0 :(得分:94)
自动完成有两个部分:
如fixje所述,readline库管理命令行编辑,并在按下tab时回调bash,以启用完成。 Bash然后给出(参见下一点)可能的完成列表,并且readline插入尽可能多的字符,这些字符由已经输入的字符明确标识。(您可以配置readline库,请参阅Command line editing部分有关详细信息,请参阅Bash手册。)
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
。
答案 1 :(得分:7)
如果您对基础知识感兴趣: Bash使用readline,其中包含历史记录和基本完成功能。如果您想要详细了解,可以检查来源。 此外,您可以使用readline构建自己的CLI接口并完成