Bash确认不会等待用户输入

3

我正在尝试使用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"

2
不太清楚。哪里出了问题,期望的行为是什么? - anubhava
实际上这是一个 .git/hooks/commit-msg 文件,所以当用户运行 git commit -m 'Hello' 命令时,commit-msg 就会被触发启动。 - BentCoder
4
看一下这个答案:如何在commit-msg钩子中提示用户,标准输入是关闭的,你可以通过添加 ls -l /dev/fd/ 来查看:0 -> /dev/null。另一个解决方案可能是执行 exec 0<&1 - Nahuel Fouilleul
@NahuelFouilleul 看起来它正在工作。谢谢你提供的链接。 - BentCoder
@NahuelFouilleul或BentCoder,你们中的一位应该提供一个可接受的答案。这是对其他人有用的问题,应该有一个被接受的答案。 - glenn jackman
显示剩余3条评论
3个回答

6

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

ls -l /dev/fd/

这提供了

... 0 -> /dev/null

正如此帖子所述,这是与提交消息挂钩相关的IT技术问题。

exec 0< /dev/tty

该命令将标准输入还原为tty。另一个解决方案是注意到标准输出和错误仍然被重定向到tty。

exec 0<&1

5
原始问题存在重要部分缺失,这是我的错,一开始没有很清楚地说明。在@NahuelFouilleul的评论后变得明显起来。确认/问题提示没有等待用户按键。原因是我的bash脚本被git钩子调用。在这种情况下,事情似乎以略微不同的方式完成。解决方案如下,但原始答案在这里
#!/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

-1

试试这个:

echo -n "Continue  (y/n)?"
read CONT
if [ "$CONT" = "n" ]
then
  echo "NO"
else
  echo "YES"
fi

echo -n 表示不换行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接