Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash选项卡完成是如何工作的?_Bash_Shell_Autocomplete - Fatal编程技术网

bash选项卡完成是如何工作的?

bash选项卡完成是如何工作的?,bash,shell,autocomplete,Bash,Shell,Autocomplete,我最近花了很多时间在shell中,我想知道tab autocomplete是如何工作的。背后的机制是什么?bash如何知道每个目录的内容?如果您对基础知识感兴趣: Bash使用的是历史记录和基本完成。如果您想获得详细的了解,可以检查源代码。 此外,您还可以使用readline构建自己的CLI界面,以完成自动完成功能有两个部分: 正如fixje已经提到的那样,readline库管理命令行编辑,并在按下tab键时回调bash以启用完成。Bash然后给出(参见下一点)一个可能的补全的列表,并且rea

我最近花了很多时间在shell中,我想知道tab autocomplete是如何工作的。背后的机制是什么?bash如何知道每个目录的内容?

如果您对基础知识感兴趣: Bash使用的是历史记录和基本完成。如果您想获得详细的了解,可以检查源代码。
此外,您还可以使用readline构建自己的CLI界面,以完成自动完成功能有两个部分:

  • 正如fixje已经提到的那样,readline库管理命令行编辑,并在按下tab键时回调bash以启用完成。Bash然后给出(参见下一点)一个可能的补全的列表,并且readline插入尽可能多的由已经键入的字符明确标识的字符。(您可以非常多地配置readline库,有关详细信息,请参阅Bash手册的一节。)

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

    本节介绍了定义您自己的完井作业的部分。简言之,与
    complete«options»«command»
    定义某些命令的完成。例如
    complete-u su
    说 完成
    su
    命令的参数时,搜索当前系统的用户

    如果这比 正常选项可以包括(例如,根据参数索引或之前的参数,不同的补全), 您可以使用
    -F function
    ,该函数随后将调用一个shell函数来生成可能完成的列表。 (例如,这用于git完成,这非常复杂,取决于子命令,有时也取决于 在给定的选项上,有时使用分支名称(bash不知道这些名称)


您可以简单地使用
complete
,列出当前bash环境中定义的现有完成项,以了解可能的情况。如果您安装了bash完成包(或以系统上的名称命名),安装了许多命令的完成,正如Wrikken所说,
/etc/bash_completion
包含一个bash脚本,该脚本通常在shell启动时执行以配置此脚本。其他自定义完成脚本可以放在
/etc/bash_completion.d
中;这些脚本都来自
/etc/bash_completion
>您可能需要检查
/etc/bash_completion
(至少,这是Debian中有很多魔力的地方)@Wrikken:这就是bash_完成,它依赖于制表符完成,但并不完全取决于它是如何完成的。在*nix stackexchange上还有几个问题,包括:SU:Man页面上至少有一个问题只针对独立命令,不针对shell内置。但它是我链接的bash手册的一部分。