如何在 shell 脚本中按下 Control+C 时取消进程?

How to cancel a process when Control+C is pressed in a shell script?

我有一个脚本可以完成一些工作。它以正确的方式进行,但需要一段时间才能结束。因为我想模拟 "job is running now" 我添加了一个微调光标动画。

我在我的脚本开头调用它,然后我将该函数的 PID 分配给一个变量,当一切都完成后,我简单地杀死它以停止动画。

#!/bin/bash

spinner &
SPINNER_PID=$!

# a lot of stuff going on here...
# takes some time to finish

kill $SPINNER_PID &>/dev/null

printf "All done"

函数定义:

spinner() {
  local i sp n
  sp='/-\|'
  n=${#sp}
  while sleep 0.1; do
    printf "%s\b" "${sp:i++%n:1}"
  done
}

如果我不打扰,一切都很好。

想象一下,我想通过调用 Control+C 来取消我的长任务。它取消了,但微调器显然仍然有动画,因为它注意到其他地方是一个无限循环。

当脚本被手动取消并且不会达到 kill $SPINNER_PID &>/dev/null 时,我如何杀死它?

似乎有一个名为 trap 的语句允许您在按下 Ctrl-C 时 运行 编码。有很好的解释here, and this website 解释如何 运行 Ctrl-C 上的函数。

trap your_func INT