我如何脚本调用SIGINT (CTRL+C)?



我的问题是:我如何通过代码实现对SIGINT (CTRL+C)的调用,而不是在信号中使用用户键?

脚本是轻松有趣的,但也是一个学习工具(对我来说),因为我正在逐步实现特性和功能,以增加我对BASH脚本知识的理解。

具体来说,我发现很难利用信号捕获以及如何使它与我的脚本的其余部分一起工作。实际上,在一段时间之后,应该调用SIGINT,并且在到达程序结束之前应该有一个切换到下一组指令的过程。虽然有许多捕获SIGINT的例子,在前台和后台处理进程id,但我无法理解它们,在那里,我可以相当自信地尝试实现。

我有这个,

#!/usr/bin/bash
read -p "What is your name?" name
read -p "How old are you?" age
printf "Hello ${name^}; you are ${age} years old."
printf "Let's find out when you will become rich."
trap ctrl_c INT
ctrl_c()
{
flag=1
}
dots()
{
if [[ "$" -eq 1 ]]; then
echo "."
fi
if [[ "$2" -eq 2 ]]; then
echo ".."
fi
if [[ "$3" -eq 3 ]]; then
echo "..."
fi
flag=0
dot_count=1
while [[ "$flag" -eq 0 ]]; do
if [[ $dot_count -eq 4 ]]; then
dot_count=1
fi

printf "r%sCalculating%s" "$(tput el)" "$(dots "$dot_count")"
dot_count=$((dot_count + 1))
sleep 1
done
printf "r%sCalculating... [Done]" "$(tput el)"
...
get_rich=$((($RANDOM) + $age))
printf "You'll be rich by the time you are $get_rich!n"

函数ctrl_c()似乎没有任何用途,因为,据我所知,它没有被调用;只有设置了"flag=0",进度条才会正常工作。物理进入CTRL+C停止进度条,并允许程序继续到其结束。那么,ctrl_c真的是必需的吗?如果没有flag=0, while-loop可以用另一种方式写吗?

最终,是否有一种方法可以编程地发送SIGINT?

  1. 你是对的,在这种情况下,你可以摆脱ctrl_c
  2. 你可以像@dan建议的那样在while循环的某个地方添加kill -INT $$命令。在下面的示例中,我将它添加到dot_count等于4时。在这种情况下,没有必要按下键盘上的Ctrl+C;当dot_count到达4后,脚本将终止。
#!/usr/bin/bash
read -p "What is your name?" name
read -p "How old are you?" age
printf "Hello ${name^}; you are ${age} years old."
printf "Let's find out when you will become rich."
trap flag=1 INT
dots()
{
if [[ "$1" -eq 1 ]]; then
echo "."
fi
if [[ "$2" -eq 2 ]]; then
echo ".."
fi
if [[ "$3" -eq 3 ]]; then
echo "..."
fi
}
flag=0
dot_count=1
while [[ "$flag" -eq 0 ]]; do
if [[ $dot_count -eq 4 ]]; then
dot_count=1
kill -INT $$
fi

printf "r%sCalculating%s" "$(tput el)" "$(dots "$dot_count")"
dot_count=$((dot_count + 1))
sleep 1
done
printf "r%sCalculating... [Done]" "$(tput el)"

get_rich=$((($RANDOM) + $age))
printf "You'll be rich by the time you are $get_rich!n"

我在Ubuntu 22.04上运行它得到以下结果:

gomfy:signal$ bash script.sh 
What is your name?G 
How old are you?98
Calculating... [Done]You'll be rich by the time you are 26348!

最新更新