我可以理解 bash 自动完成适用于标准实用程序。但它如何为 Oracle SQL 加载器等自定义程序执行自动完成功能呢?
在以下命令中,如果您按 Tab 键,control=
那么它会自动补全到控制文件名:
sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
它如何知道此时必须填写控制文件而不是其他文件?
答案1
巴什的可编程完成通过解析命令行并找出正在完成的操作来工作:
- 有些上下文会被特殊处理,例如命令中的第一个单词作为命令名称完成,a 之后的内容
$
作为变量名称完成,等等。 - 在这些上下文之外,bash 尝试完成命令的参数,并应用命令的设置或失败(通常是这种情况)的命令的基本名称。
例如,在 后,bash 补全以 开头的命令名称。之后,bash 补全以 开头的变量名称。之后,bash 应用命令的完成规则。完成规则可以指定类别(用户、变量、文件等)、文件名的通配符模式或者要执行的函数或代码片段。sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
完成规则由以下定义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 中获得灵感),但是不同的内置函数、语法和功能。