如何将 bash `compgen` 与我自己的脚本选项一起使用?

Tim*_*gan 2 bash shell bash-completion compgen

我是新手compgen,想将它用于我正在编写的脚本。该脚本可以将“命令”和“选项”作为参数,如下所示:

script add "value"
script --path "/a/file/path" add "value"
# and others
Run Code Online (Sandbox Code Playgroud)

我写了一个完成脚本,如下所示:

_script_completions() {
    arg_index="${COMP_CWORD}"
    if [[ "${arg_index}" -eq 1 ]]; then
        COMPREPLY=($(compgen -W "--path add" "${COMP_WORDS[1]}"))
    fi
}
complete -F _script_completions script
Run Code Online (Sandbox Code Playgroud)

该脚本对于“add”命令运行良好,但在“--path”选项上失败。例如:当我输入:

$ script --p<TAB>
Run Code Online (Sandbox Code Playgroud)

我得到:

$ ./script --pbash: compgen: --: invalid option
compgen: usage: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
Run Code Online (Sandbox Code Playgroud)

如何正确添加我自己的脚本选项的补全?

Soc*_*owi 7

withcompgen -W "--path add" "${COMP_WORDS[1]}"最后script --p<tab>一个参数${COMP_WORDS[1]}变成--pand 然后被解释为选项 forcompgen而不是完成单词。您可以使用参数--来标记选项的结尾:

_script_completions() {
    arg_index="${COMP_CWORD}"
    if [[ "${arg_index}" -eq 1 ]]; then
        COMPREPLY=($(compgen -W "--path add" -- "${COMP_WORDS[1]}"))
    fi
}
complete -F _script_completions script
Run Code Online (Sandbox Code Playgroud)