如何为特定路径下的prog程序配置专属Bash补全规则?
实现特定路径下prog的专属Bash补全
可以实现,核心思路是在补全函数中先验证当前命令对应的真实文件路径是否为/a/prog,只有匹配时才执行补全逻辑,具体方案如下:
补全脚本实现
_complete_prog() { # 将输入的命令路径解析为绝对真实路径(兼容相对/绝对/嵌套相对路径) local cmd_realpath # 优先用realpath,无realpath则用readlink -f(适配更多系统) if command -v realpath >/dev/null 2>&1; then cmd_realpath=$(realpath "${COMP_WORDS[0]}" 2>/dev/null) else cmd_realpath=$(readlink -f "${COMP_WORDS[0]}" 2>/dev/null) fi # 仅当真实路径匹配目标文件时,执行补全逻辑 if [ "$cmd_realpath" != "/a/prog" ]; then return fi # 原补全逻辑:仅第一个参数补全aaa/bbb if [ "$COMP_CWORD" -eq 1 ]; then COMPREPLY=($(compgen -W "aaa bbb" "${COMP_WORDS[1]}")) fi } # 将补全函数绑定到所有名为prog的命令(函数内部会做路径校验) complete -F _complete_prog prog
方案说明
- 满足要求1:其他路径下的
./prog(如/b/prog)会被解析为对应的真实路径,与/a/prog不匹配,补全函数直接返回,不会应用补全规则。 - 满足要求2:无论是输入
/a/prog、./prog(在/a目录下)、././prog还是其他指向/a/prog的相对路径,都会被解析为同一个绝对真实路径,触发补全逻辑。
验证方法
- 在
/a目录下执行./prog <TAB><TAB>,会显示aaa bbb补全选项; - 在
/b目录下(假设存在/b/prog)执行./prog <TAB><TAB>,不会触发该补全规则,保持系统默认补全行为。
内容的提问来源于stack exchange,提问作者SU3
相关产品推荐
相关产品推荐

