如何让Bash补全功能在foo的包装脚本bar1/bar2中生效?
复用foo的bash补全功能到包装脚本
方法一:直接关联已有补全函数(简单场景)
如果包装脚本仅传递后续参数,无需调整补全上下文,可直接让bash将bar系列脚本的补全指向foo的补全函数:
先查看foo对应的补全函数名:
complete -p foo输出会类似
complete -F _foo foo,其中_foo就是foo的补全函数名。将所有bar系列脚本关联到这个补全函数:
若知道所有包装脚本的名字,可直接列出:complete -F _foo bar1 bar2 bar3 ...要是脚本数量多或名字有规律(比如均以bar开头),可用通配符或命令自动匹配:
complete -F _foo $(compgen -c | grep '^bar')
方法二:补全上下文修正(精准匹配包装脚本参数)
由于包装脚本会给foo添加固定的--some-option some-value参数,直接关联补全函数的话,补全逻辑会把bar1当成foo本身,不会考虑前置固定参数。这种情况可写一个轻量包装补全函数,调整补全上下文后再调用foo的补全函数:
在bash配置文件(比如
~/.bashrc或/etc/bash_completion.d/下的自定义脚本)中添加以下函数:_bar_wrapper_complete() { # 重构COMP_WORDS:替换命令为foo,并插入固定参数 COMP_WORDS=(foo --some-option some-value "${COMP_WORDS[@]:1}") # 调整COMP_CWORD:原bar脚本的第1个参数对应foo的第3个参数位置 COMP_CWORD=$((COMP_CWORD + 2)) # 调用foo的补全函数 _foo }将所有bar系列脚本关联到这个包装函数:
complete -F _bar_wrapper_complete bar1 bar2 bar3 ...
配置完成后,输入bar1 按Tab时,bash会按照foo --some-option some-value 之后的参数逻辑补全,完全匹配包装脚本的实际执行行为。
内容的提问来源于stack exchange,提问作者jjg
相关产品推荐
相关产品推荐

