它如何知道命令需要什么参数以及是否需要文件作为输入?它如何知道有哪些命令可用?
答案1
StackExchange 上有人问了一个几乎相同的问题:
Bash 的 tab 补全如何工作?
最近我花了很多时间在 shell 上,我想知道 tab 自动完成功能是如何工作的。它背后的机制是什么?bash 如何知道每个目录的内容?
得票最高的答案:
自动完成有两个部分:
readline 库fixje 已经提到过,管理命令行编辑,并在按下 tab 时回调 bash,以启用补全。然后,Bash 给出(参见下一点)一个可能的补全列表,readline 插入尽可能多的字符,这些字符由已输入的字符明确标识。(您可以对 readline 库进行大量配置,请参阅命令行编辑有关详细信息,请参阅 Bash 手册。
Bash 本身具有为各个命令定义补全机制的内置功能
complete
。如果当前命令未定义任何内容,则使用文件名补全(使用 opendir/readdir,如 Ignacio 所述)。定义你自己的完成的部分在部分中描述可编程完成简而言之,
complete «options» «command»
您可以定义某些命令的完成。例如complete -u su
说 当完成命令的参数时su
,搜索当前系统的用户。如果这比正常选项所能涵盖的更复杂(例如,根据参数索引或取决于先前的参数的不同补全),则可以使用
-F function
,然后它将调用 shell 函数来生成可能的补全列表。(这用于 git 补全,它非常复杂,取决于子命令,有时取决于给定的选项,有时使用分支的名称(bash 对此一无所知)。
您可以使用简单的 列出当前 bash 环境中定义的现有补全complete
,以了解可能的补全。如果您安装了 bash-completion 包(或系统上的名称),则会安装许多命令的补全,并且正如 Wrikken 所说,/etc/bash_completion
包含一个 bash 脚本,该脚本通常在 shell 启动时执行以配置它。其他自定义补全脚本可以放在 中/etc/bash_completion.d
;这些都来自/etc/bash_completion
。