【SHELL】命令补全

# 指定文件
dodo_path=/home/skull/work/scripts/dodo

echo "hello skull"

## COMP_WORDS 是一个 bash 内建的数组变量,它包含了当前命令行中的所有单词
# 例如,如果你输入了 dodo make,那么 COMP_WORDS 就会是 ('dodo', 'make')

## COMP_CWORD 是一个 bash 内建的整数变量,它表示 COMP_WORDS 中当前单词的索引
# 例如,如果你输入了 dodo make 并且光标在 mkae 之后,那么 COMP_CWORD 就会是 2,
# 你已经完成了 dodo 和 make 的输入,实际在第 2 个位置(索引从 0 开始)

function define_complete {
    # COMPREPLY 是 bash 内建的一个特殊数组,bash 会使用这个数组的内容作为补全建议显示给用户
    COMPREPLY=()
    # echo -e "\nCOMP_CWORD: "$COMP_CWORD
    case $COMP_CWORD in
        1)
        arg=`grep -w ^"usage: dodo" $dodo_path |grep -o '\[.*\]' |sed -e 's/\[//g'|sed -e 's/\]//g'`
        # -W "$arg" 参数告诉 compgen 从 $arg 变量中获取可能的补全选项
        # -- ${COMP_WORDS[COMP_CWORD]} 参数指定了当前的部分单词,也就是用户已经输入但还没有完成的那部分单词
        # compgen 会从 $arg 中选择那些以当前部分单词开头的选项,作为补全建议
        COMPREPLY=($(compgen -W "$arg" -- ${COMP_WORDS[COMP_CWORD]}))
        ;;
        2)
        option=`grep -w "dodo ${COMP_WORDS[COMP_CWORD - 1]}" $dodo_path |grep -o '\[.*\]' |sed -e 's/\[//g'|sed -e 's/\]//g'`
        COMPREPLY=($(compgen -W "$option" -- ${COMP_WORDS[COMP_CWORD]}))
        ;;
    esac
}

complete -F define_complete dodo

 

posted @ 2023-01-05 17:36  壹点灵异  阅读(259)  评论(0编辑  收藏  举报