Bash 自动完成如何工作?

Ksh*_*rma 10 bash autocomplete

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

在以下命令中,如果您按 Tab 之后,control=它会自动完成控制文件名:

sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
Run Code Online (Sandbox Code Playgroud)

它怎么知道它必须在那时填写控制文件而不是其他文件?

Gil*_*il' 7

Bash 的可编程完成通过解析命令行并确定正在完成的内容来工作:

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

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

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

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

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