当我使用svn之类的程序并在Gnome终端中输入以下内容时:
是否可以在自定义bash脚本中执行类似的操作?

评论

解释“ bash脚本”,是指在编辑脚本时?您想用它做什么?

在控制台中使用脚本时

至于放置完成内容的位置,请参阅此问题以及那里已被接受的答案的注释。

#1 楼

您可以使用可编程完成。请看/etc/bash_completion/etc/bash_completion.d/*的一些示例。

评论


包括与问题直接相关的简单示例如何?

–MountainX
2013年6月23日在21:14



Ubuntu 16的实际脚本位于/ usr / share / bash-completion / completions /

–彼得
17年9月26日在21:26

Imo,示例应该包含在答案中,而不是链接中。

–billynoah
18年3月30日在18:24

我相信这个平台应该是可以通过简单的Google搜索找到的完整文档的更实用的替代品。转储文档链接无济于事。包含锚点的链接肯定不会有太大变化。

–timuçin
18年6月24日在8:59

提供的链接已经具有该链接-今天可能会,但明天可能不会。或明年。或十年后。无论您对文档仍然有何建议,由于这些原因,Stack Overflow都不鼓励仅链接的答案。

–利亚姆·道森(Liam Dawson)
19年1月20日在9:23

#2 楼

您必须创建一个新文件:
/etc/bash_completion.d/foo

要进行静态自动完成(例如--help / --verbose),请添加以下文件:
_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo



COMP_WORDS是一个包含当前命令行中所有单个单词的数组。

COMP_CWORD是包含当前光标位置的单词的索引。

COMPREPLY是一个数组变量, Bash读取可能的补全。

compgen命令从--help--verbose--version返回与当前单词"${cur}"匹配的元素数组:
compgen -W "--help --verbose --version" -- "<userinput>"



评论


提示:如果某人想要不以-开头的单词的建议,而不必开始输入目标单词就显示它们,只需删除if和then行。

–塞德里克·赖兴巴赫
15 Sep 16'9:23



教程-创建bash完成脚本

–拉撒路(Lazarus Lazaridis)
18 Mar 16 '18 at 11:16

答案中的路径似乎已过时。创建完成后,用户完成脚本可以存储在〜/ .local / share / bash-completion / completions /中。系统完成脚本通常存储在/ usr / share / bash-completion / completions /中。

–触角
20/11/28在15:52

#3 楼

这是一个完整的教程。
让我们看一个示例脚本admin.sh,您希望对其执行自动完成操作。
#!/bin/bash

while [ $# -gt 0 ]; do
  arg=
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_2
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

请注意选项shortlist。使用此选项调用脚本将打印出该脚本的所有可能选项。
这里有自动完成脚本:您要添加自动完成功能。您需要做的就是将您的自动完成脚本添加为bashrc,例如
_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

或将其复制到
/etc/bash.completion.d

评论


-o nospace选项有什么作用?

–安德鲁·拉玛拉(Andrew Lamarra)
17年11月11日在3:09

@AndrewLamarra -o nospace防止在成功完成之后插入空格。 (参考)

–触角
20-11-28在15:55



答案中的路径似乎已过时,因此在很大程度上不需要采购。用户完成脚本来自〜/ .local / share / bash-completion / completions /;该目录可以由用户创建。系统完成脚本通常存储在/ usr / share / bash-completion / completions /中。

–触角
20/11/28在16:00

#4 楼

所有的bash完成都存储在/etc/bash_completion.d/中。因此,如果要使用bash_completion构建软件,则值得deb / make install在该目录中放置一个文件,其中包含软件名称。这是Rsync的bash完成脚本示例:最简单的示例之一是rrdtool文件。

评论


我们可以配置完井以从其他位置加载吗? IE浏览器〜/ .local

–克里斯
14年7月31日在16:14

是的,您可以在任意位置放置这样的文件,然后在〜/ .bashrc中放置源〜/ .local / mycrazycompletion。

– Stefano Palazzo
16 Mar 22 '16 at 5:40

@Chris请参阅Bash完成常见问题解答中的说明

– jarno
19年1月20日在12:14

如今,大多数补全位于命令pkg-config --variable = completionsdir bash-completion`给出的目录中,该目录是上面链接的Bash Completion FAQ给出的建议。

– jarno
19年1月20日在12:20

答案中的路径似乎已过时。按照此常见问题解答,用户完成脚本来自〜/ .local / share / bash-completion / completions /;该目录可以由用户创建。系统完成脚本通常存储在/ usr / share / bash-completion / completions /中。

–触角
20-11-28在16:02

#5 楼

如果您想要的只是一个简单的基于单词的自动完成功能(因此没有子命令完成或任何其他操作),则complete命令具有一个-W选项,可以执行正确的操作。例如,我有以下内容我的.bashrc中的行可以自动完成一个名为jupyter的程序:

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'


现在jupyter <TAB> <TAB>对我来说自动完成。

gnu.org上的文档对您有所帮助。

它似乎依赖于正确设置了IFS变量,但这对我没有任何问题。

要添加文件名完成和默认的BASH完成,使用-o选项:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'


要在zsh中使用此选项,请在complete中运行~/.zshrc命令之前添加以下代码:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi


评论


我如何使用bash jupyter 进行此项工作?

– papampi
18-11-20在11:02



@papampi,我认为它仅在一个完成级别上起作用-我认为要在2层上完成,您需要上面更复杂的答案之一。另外,我最近阅读了有关bash完成的相当不错的教程。它并不能完全满足您的需求,但也许可以帮到您。祝好运!

–本
18年11月20日在21:05