Bash命令补全问题:如何为thermostat.sh实现第三参数补全
Bash命令补全问题:如何为thermostat.sh实现第三参数补全
嘿,我来帮你搞定这个bash命令补全的问题!你现在的核心问题是第三参数的补全逻辑写错了,咱们一步步来修正。
首先先指出两个小细节问题:
- 你的脚本开头的
#/usr/bin/env bash少了个感叹号,应该写成#!/usr/bin/env bash,不然系统可能没法正确识别这是bash脚本。 - 第三参数补全时,你给
compgen传的匹配前缀不对,不是${COMP_WORDS[1]} ${COMP_WORDS[2]},而是要针对当前正在输入的那个单词来匹配,也就是用${COMP_WORDS[COMP_CWORD]}——COMP_CWORD是bash补全里的内置变量,代表当前光标所在的单词索引。
下面是修正后的完整脚本,我还把if-elif改成了case语句,逻辑更清晰,后续扩展其他参数也方便:
#!/usr/bin/env bash _thermostat-completions() { case ${#COMP_WORDS[@]} in 2) # 补全第二个参数(主命令) COMPREPLY=($(compgen -W "off program hold override" "${COMP_WORDS[COMP_CWORD]}")) ;; 3) # 当第二个参数是override时,补全第三个参数选项 if [ "${COMP_WORDS[1]}" = "override" ]; then COMPREPLY=($(compgen -W "off holiday" "${COMP_WORDS[COMP_CWORD]}")) fi ;; esac } complete -F _thermostat-completions thermostat.sh
给你解释下关键逻辑:
- 当你输入
thermostat.sh然后按tab时,${#COMP_WORDS[@]}是2,这时候会补全主命令选项:off、program、hold、override。 - 当你输入
thermostat.sh override然后按tab时,${#COMP_WORDS[@]}是3,且第二个参数是override,这时候就会补全它的子选项off和holiday。如果输入到一半比如thermostat.sh override o,按tab会自动补全成off,完全符合你的需求。
测试方法很简单:把这个脚本保存成任意文件名(比如thermostat-completion.sh),然后在终端里执行source thermostat-completion.sh,之后就能体验正常的补全效果啦!
备注:内容来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

