git hook中的Bash Option菜单

时间:2014-01-30 12:48:09

标签: 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=$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 
它按预期向我展示了一个菜单。 但是当在切换分支后执行此挂钩时,它不会等待某人输入值,但在显示菜单后,脚本结束。

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

无论出于何种原因,post-checkout的标准输入已连接到/dev/null,因此select无法立即读取任何输入。 (我无法在任何地方找到此文档,但能够使用strace确认。)一种解决方案是简单地从终端重定向标准输入:

select opt in "${options[@]}"
do
    ...
done < /dev/tty