我在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
}
我正在努力做到这一点。
谢谢
答案 0 :(得分:0)
陷阱名称不能以SIG
为前缀,因为它是未定义的。
您要在陷阱处理程序中执行的另一件事是: 消除陷阱 因此它们不会在处理程序处理时触发。
#!/usr/bin/env sh
quit() {
trap false ABRT INT # Neutralize traps in the quit handler by assigning the false function
printf '\nDo you want to quit ? (y/N)\n' # Uppercase N show the default choice
read -r n
case "${n}" in
[yY]) # Match y or Y
exit
;;
esac
trap quit ABRT INT # Re-enable traps on self
}
trap quit ABRT INT # Attach the SIGABRT and SIGINT traps to the quit function
i=1
while true; do
echo "$i"
i=$((i+1))
sleep 1
done
样品运行:
1
2
^C
Do you want to quit ? (y/n)
n
3
4
^C
Do you want to quit ? (y/n)
^C5
6
7
8
^C
Do you want to quit ? (y/n)
y
答案 1 :(得分:0)
尝试以下操作。
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 "........"
site=$(read -p "0000" -e site; echo "$site")
done