最近,我在shell中花了很多时间,我想知道选项卡自动完成的工作原理。其背后的机制是什么?bash如何知道每个目录的内容?
最近,我在shell中花了很多时间,我想知道选项卡自动完成的工作原理。其背后的机制是什么?bash如何知道每个目录的内容?
Answers:
自动补全分为两部分:
正如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
。
/etc/bash_completion
(至少,这是Debian中很多魔术的地方)。