如何创建具有自动完成功能的脚本?

如何创建具有自动完成功能的脚本?

当我使用类似的程序svn并在 Gnome 终端中输入时:

svn upd

然后点击Tab自动完成功能:

svn update

我可以在我的自定义 bash 脚本中执行类似操作吗?

答案1

您必须创建一个新文件:

/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>"

来源

答案2

这是一个完整的教程。

让我们举一个admin.sh您希望自动完成功能的脚本示例。

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  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。使用此选项调用脚本将打印出该脚本的所有可能选项。

这里是自动完成脚本:

_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

请注意,complete 的最后一个参数是要添加自动完成功能的脚本的名称。您需要做的就是将自动完成脚本添加到 bashrc 中,如下所示:

source /path/to/your/autocomplete.sh

或将其复制到:

/etc/bash_completion.d

答案3

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

答案4

如果您想要的只是一个简单的基于单词的自动完成(因此没有子命令完成或任何其他内容),则该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'

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

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

相关内容