我正在尝试使用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"
答案 0 :(得分:4)
更改为评论回答:在commit-msg挂钩中似乎标准输入已关闭,确实可以通过添加以下命令来检查
ls -l /dev/fd/
给出了
... 0 -> /dev/null
中所述
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表示没有换行符