Bash 自动完成是如何工作的?

Bash 自动完成是如何工作的?

我可以理解 bash 自动完成适用于标准实用程序。但它如何为 Oracle SQL 加载器等自定义程序执行自动完成功能呢?

在以下命令中,如果您按 Tab 键,control=那么它会自动补全到控制文件名:

sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log

它如何知道此时必须填写控制文件而不是其他文件?

答案1

巴什的可编程完成通过解析命令行并找出正在完成的操作来工作:

  1. 有些上下文会被特殊处理,例如命令中的第一个单词作为命令名称完成,a 之后的内容$作为变量名称完成,等等。
  2. 在这些上下文之外,bash 尝试完成命令的参数,并应用命令的设置或失败(通常是这种情况)的命令的基本名称。

例如,在 后,bash 补全以 开头的命令名称。之后,bash 补全以 开头的变量名称。之后,bash 应用命令的完成规则。完成规则可以指定类别(用户、变量、文件等)、文件名的通配符模式或者要执行的函数或代码片段。sqllTabsqllsqlldr $aTabasqlldr Tabsqlldr

完成规则由以下定义complete内置。 Bash 不会跟踪complete内置函数被调用的时间或它所在的脚本(如果有)。大多数发行版都附带bash 完成包,提供了一系列常用命令的规则。这采用一系列脚本文件的形式,其中包含对 的调用complete,以及必须读取.bashrc(或/etc/bash.bashrc如果实现)的脚本以加载所有这些脚本:通常. /etc/bash_completion需要激活可编程完成并加载可用脚本。

标准包不包括对sqlldr.如果你有这样的支持,它一定来自不同的来源。此源可能已在类似目录中放置了一个文件/etc/bash_completion.d,或者可能附带了在您的.bashrc.您可以使用complete -p sqlldr查看当前规则sqlldr;如前所述,这不会告诉您这些规则是从哪里加载的。

tcsh、zsh 和 Fish 有一些相似的机制(每个人都从 tcsh 中获得灵感),但是不同的内置函数、语法和功能。

相关内容