GitHook中的Bash选项菜单

GitHook中的Bash选项菜单,git,bash,Git,Bash,我想在开发人员切换分支时显示bash菜单。 我已经创建了一个像这样的签出后钩子 #!/usr/bin/env bash options=("Quit" "Option 1" "Option 2" "Option 3" ) optionsprompt='Please enter your choice: ' sub1=("Option 1 sub 1" "Option 1 sub 2") sub1prompt='Please enter your choice: ' PS3=$options

我想在开发人员切换分支时显示bash菜单。 我已经创建了一个像这样的签出后钩子

#!/usr/bin/env bash

options=("Quit" "Option 1" "Option 2" "Option 3" )
optionsprompt='Please enter your choice: '

sub1=("Option 1 sub 1" "Option 1 sub 2")
sub1prompt='Please enter your choice: '

PS3=$optionsprompt
select opt in "${options[@]}"
do
    case $opt in
         "Quit")
            break
            ;;
        "Option 1")
            echo "you chose choice 1"
            PS3=$sub1prompt
            select sub1opt in "${sub1[@]}"
            do
                case $sub1opt in
                    "Option 1 sub 1")
                        echo "you chose choice 2"
                        ;;
                    "Option 1 sub 2")
                        echo "you chose choice 2"
                        ;;
                 esac
            done
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 2")
            echo "you chose choice 3"
            ;;

        *) echo invalid option;;
    esac
done
当我手动执行这个钩子时

./post-checkout 
它给了我一份菜单。 但是当这个钩子在切换分支后执行时,它不会等待某人输入值,而是在显示菜单后,脚本结束


关于如何解决这个问题有什么想法吗?

无论出于何种原因,
签出后
将其标准输入连接到
/dev/null
,因此
选择
立即无法读取任何输入。(我在任何地方都找不到这方面的文档,但可以使用
strace
进行确认)一种解决方案是直接从终端重定向标准输入:

select opt in "${options[@]}"
do
    ...
done < /dev/tty
选择opt-in“${options[@]}”
做
...
完成