Bash自定义:命令补全输入--first=后无法正确提示候选参数问题
补全函数修复方案
问题根源
你的补全逻辑存在两个核心错误导致不符合预期:
--first=*分支下的字符串截取逻辑错误:${current##--first*,}是匹配到逗号才会截取前缀,你的场景中没有逗号,该操作完全不生效,最终用arg1/arg2匹配--first=时没有结果,Bash触发默认补全逻辑才会出现--first=--first的错误结果- 补全候选没有保留
--first=前缀,即使匹配到参数也会覆盖原有输入内容
修复后的完整代码
__sample_complete() { local OPTIONS=('--first' '--first=') local FIRST_ARGUMENTS=('arg1' 'arg2') local current=$2 local previous=$3 case $current in --first=*) # 仅提取--first=之后的内容用于匹配参数 local param_part=${current#--first=} # 通过compgen的-P参数自动给补全项加上--first=前缀,保留原有输入 readarray -t COMPREPLY < <(compgen -o nospace -P '--first=' -W "${FIRST_ARGUMENTS[*]}" -- "$param_part") ;; *) readarray -t COMPREPLY < <(compgen -W "${OPTIONS[*]}" -- "$current") ;; esac } complete -F __sample_complete :
验证效果
加载上述函数后,输入: --first=按下Tab,会直接弹出arg1/arg2作为候选,补全后结果为--first=arg1/--first=arg2,符合预期。
内容的提问来源于stack exchange,提问作者Emily Grace Seville
相关产品推荐
相关产品推荐

