Bash自动完成如何工作?


9

我可以理解bash自动完成功能适用于标准实用程序。但是,如何对自定义程序(例如Oracle SQL loader)自动完成?

在以下命令中,如果按Tab键,control=则它将自动完成为控制文件名:

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

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


2
参数的完成是通过功能完成的。它们中的大多数都建立在中/etc/bash_completion.d。另请参阅/etc/bash_completion并查看的输出set,您的环境已经增长了多少。
ott-- 2015年

@ott我应该在那个位置寻找什么?我看不到与sqlldr相关的任何内容。我所拥有的是:gdbus-bash-completion.sh gvfs-bash-completion.sh pk-completion.bash yum.bash。的输出set也一样有趣。
Kshitiz Sharma 2015年

也可以使用的某些脚本来完成/etc/profile.d。也许您.bash_profile.bashrc已被修改。
ott--

这些功能与正常功能有何不同?我该如何定义自己的脚本来为自定义脚本提供自动完成功能?您能指出正确的方向吗?
Kshitiz Sharma

1
@KshitizSharma,bash-completion自以来动态加载完成1.90。试试:sqlldr<space><tab><enter>。然后输入complete -p sqlldr
Evgeny Vereshchagin

Answers:


6

Bash的可编程完成工作是通过分析命令行并确定要完成的工作来完成的:

  1. 一些上下文被特殊对待,例如,命令中的第一个单词作为命令名称完成,紧随其后的$作为变量名称完成,等等。
  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那里得到灵感),但是内建函数,语法和功能却不同。


是的,您无法找到complete调用位置。但是您可以找到定义完成功能的源文件名和行号。complete -p sudo # outputs complete -F _sudo sudoshopt -s extdebugdeclare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo。(但请参阅我有关动态完成加载和的评论complete -p)。
Evgeny Vereshchagin

and the settings for the basename of the command are applied。不可以。您可以为date和设置不同的规格/bin/date。参考资料:如果命令字是完整路径名,则首先搜索完整路径名的compspec。如果找不到完整路径名的compspec,则尝试为最后一个斜杠之后的部分找到一个compspec
Evgeny Vereshchagin 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.