【发布时间】:2019-07-08 16:17:17
【问题描述】:
我在 bash 脚本的顶部添加了以下内容:
quit() {
echo "Do you want to quit ? (y/n)"
read n
if [ "$n" = 'y' ]; then
exit
fi
}
trap quit INT
trap quit SIGINT
trap quit SIGTERM
脚本会询问用户一系列问题,然后根据结果执行操作。有时按 CTRL+C 似乎可以工作。
但其他时候我只收到Do you want to quit ? (y/n) 并且脚本锁定了。这可能在 IF 语句或 WHILE / DONE 中发生。
但是如果你在回声发生时计时 CTRL+C 我可以使问题发生.. 即:同时 CTRL+C作为回声。
有没有办法总是捕获 CTRL+C 并提示用户?然后让他们决定是否要退出?
此代码显示正在发生的问题..
quit() {
echo "Do you want to quit ? (y/n)"
read n
if [ "$n" = 'y' ]; then
exit
fi
}
trap quit INT
trap quit SIGINT
trap quit SIGTERM
for i in `seq 1 50`; do
sleep 1
echo -e "........"
read -i "0000" -e site
done
尝试将 CTRL+C 计时,就像屏幕上显示 '........' 和 0000 时出现问题。
这似乎有很大的不同。
quit() {
while read -e -t 0.1; do : ; done
read -p "Do you want to quit ? (y/n) " n
if [ "$n" = 'y' ]; then
exit
fi
}
我现在正在努力实现它。
谢谢
【问题讨论】:
-
我的猜测是您在标准输入中有一些内容被读入
$n,并且由于它与y不同,您的脚本只是在执行陷阱函数后继续执行。这听起来可能吗?如果是这样,我建议在提示输入 y/n 之前检查 this Unix&Linux SE question 以丢弃 stdin 的内容 -
与您的问题无关,但最好避免使用
echo的-e参数;它不是由 POSIX sh 标准指定的,即使在 bash 中,它的行为也会根据活动的编译时和运行时标志而变化很大。请参阅 Stephane 在 unix.stackexchange.com/questions/65803/… 中的出色回答,其中描述了echo的行为不可靠和不可移植的方面,尤其是在依赖反斜杠转义翻译时。 -
我不熟悉
read的-i标志,但鉴于它的描述,我认为这是违规者:“如果使用 readline 读取行,则将文本放入编辑缓冲区在编辑开始之前。” ;它必须将0000放入stdin,您的quit()函数会读取它而不是您想要的y/n -
我认为是
read -i- 是否有这个问题?我已经关注了@Aaron 提供的链接,但我不确定如何添加它。谢谢 -
@Aaron 我不认为它会继续......当这种情况发生时它似乎很有趣。