2011-04-06 69 views
85

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

+2

您可能想要检查'/ etc/bash_completion'(至少,这是Debian中很多魔术的地方)。 – Wrikken 2011-04-06 18:18:12

+1

@Wrikken:这是bash_completion,它依赖于制表符完成,但不完全如此。 – 2011-04-06 18:35:50

+2

关于* nix stackexchange还有几个问题,包括:http://unix.stackexchange.com/questions/4738/an-easy-bash-completion-tutorial http://unix.stackexchange.com/questions/1800/custom-autocomplete http://unix.stackexchange.com/questions/12356/how-does-tab-auto-complete-find-options-to-complete以及SU上的至少一个:http://superuser.com/问题/ 289539 /定制的bash标签完成 – Cascabel 2012-02-15 02:20:12

回答

81

有两个部分来自动完成:

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

  • Bash本身有buildin complete来定义个别命令的完成机制。如果对于当前命令没有定义,则它使用文件名完成(使用opendir/readdir,如Ignacio所述)。

    Programmable Completion部分描述了定义自己的完井部分。总之,使用 complete «options» «command»您可以定义某个命令的完成。例如complete -u su表示 当完成su命令的参数时,搜索当前系统的用户

    如果是更复杂的比 正常选项可以覆盖, 可以使用-F function,然后将调用一个shell函数生成的列表(取决于参数指标,或者根据之前的参数例如不同的完井)可能的完成。 (这是例如用于git的完成,这是非常复杂的,这取决于子,有时 在选项中给出,并使用有时分支的名称(这是什么庆典知道)。

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

7

如果您对基本知识感兴趣: Bash使用readline,它具有历史记录和基本完成功能。如果你想得到详细的理解,你可以检查来源。 此外,还可以使用输入行以完成建立自己的CLI界面