我试过了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
之后立即使用文件名自动完成,但我无法使其正常工作。
答案 0 :(得分:1)
尝试将COMPREPLY=( "${files[@]##*/}" )
替换为COMPREPLY=( $(compgen -f ${cur}) )
有关自动完成的更多信息,请参阅以下链接
答案 1 :(得分:1)
complete
有一个-o default
选项,因此您可以移除opts="ls *"; if ... fi
部分,然后执行complete -F _tracker -o default tracker
。
根据bash手册:
如果
-o default
选项提供给complete
时 compspec已定义,readline的默认完成将 如果compspec(如果尝试,则执行默认值)执行 bash completions)不生成匹配。