Bash switch/parameter 之后的文件名自动完成

Bash filename autocompletion after switch/parameter

我试过 this other questions's accepted answer 但它对我不起作用。所以请不要将此投票为重复。

我的脚本名为 "tracker",它接受以下开关:--dummy --audit_sessiones --user_count --detailed_user_count --parfile

--parfile switcj 后面应该跟一个文件名。

我有这个自动完成脚本:

_tracker() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--dummy --audit_sessiones --user_count --detailed_user_count --parfile"

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

    opts="ls *"
    if [[ ${prev} == --parfile ]]; then 
        COMPREPLY=( "${files[@]##*/}" )
        return 0
    fi
}
complete -F _tracker tracker

开关的自动完成工作正常。

但我也希望用户能够在参数 --parfile 之后立即使用文件名自动完成功能,但我无法使其工作。

尝试用 COMPREPLY=( $(compgen -f ${cur}) )

替换 COMPREPLY=( "${files[@]##*/}" )

可以在以下链接中找到有关自动完成的更多信息

An introduction to bash completion: part 1

An introduction to bash completion: part 2

complete 有一个 -o default 选项,因此您可以删除 opts="ls *"; if ... fi 部分并只执行 complete -F _tracker -o default tracker.

根据 bash 手册:

If the -o default option was supplied to complete when the compspec was defined, readline's default completion will be performed if the compspec (and, if attempted, the default bash completions) generate no matches.