Bash确认不会等待用户输入

时间:2018-02-06 10:20:24

标签: bash githooks pre-commit-hook

我正在尝试使用bash脚本实现确认提示,但出于某种原因,提示不会等待用户输入。我尝试过很多例子但到目前为止没有运气。如果它有任何不同,我在MacOS上。

我尝试了几个例子(所有复制+粘贴其他答案在SO中):

#!/bin/bash

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
    # do dangerous stuff
fi
#!/bin/bash

read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
  echo "yaaa";
else
  echo "booo";
fi
#!/bin/bash

while true; do
read -rsn1 input
if [ "$input" = "a" ]; then
    echo "hello world"
fi
done
#!/bin/bash

read -p "Continue (y/n)?" choice
case "$choice" in
  y|Y ) echo "yes";;
  n|N ) echo "no";;
  * ) echo "invalid";;
esac

这甚至没有提示任何事情:

#!/bin/bash
read -n 1 -s -r -p "Press any key to continue"

3 个答案:

答案 0 :(得分:4)

更改为评论回答:在commit-msg挂钩中似乎标准输入已关闭,确实可以通过添加以下命令来检查

ls -l /dev/fd/

给出了

... 0 -> /dev/null

this post

中所述
exec 0< /dev/tty

将标准输入恢复为tty,另一个解决方案是注意到标准输出和错误仍然重定向到tty

exec 0<&1

答案 1 :(得分:3)

最初的问题有一个重要的部分缺失,我的错是在第一时间没有说清楚。在@ NahuelFouilleul的评论之后,它变得明显了。确认/问题提示不是等待用户按键。原因是因为我的bash脚本是由git钩子调用的。在这种情况下,事情似乎以略微不同的方式完成。解决方案如下,但原始答案为here

#!/bin/bash

exec < /dev/tty

while true; do
    read -p "Accepting the offer? (y/n) " answer

    if [[ $answer =~ ^[Yy]$ ]] ;
    then
        echo "Accepted"
    else
        echo "Not accepted"
    fi

    break
done

答案 2 :(得分:0)

试试这个:

of

echo -n表示没有换行符