切换/参数后的Bash文件名自动完成

时间:2015-02-10 14:01:20

标签: bash autocomplete filenames

我试过了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之后立即使用文件名自动完成,但我无法使其正常工作。

2 个答案:

答案 0 :(得分:1)

尝试将COMPREPLY=( "${files[@]##*/}" )替换为COMPREPLY=( $(compgen -f ${cur}) )

有关自动完成的更多信息,请参阅以下链接

An introduction to bash completion: part 1

An introduction to bash completion: part 2

答案 1 :(得分:1)

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

根据bash手册:

  

如果-o default选项提供给complete时   compspec已定义,readline的默认完成将   如果compspec(如果尝试,则执行默认值)执行   bash completions)不生成匹配。