在bash中是否有可能拦截SIGINT,执行某些操作,然后将其忽略(继续运行bash)。

我知道我可以忽略SIGINT

trap '' SIGINT

我也可以在Sigint上做一些事情
trap handler SIGINT

但这仍然会在handler执行后停止脚本。例如。
#!/bin/bash

handler()
{
    kill -s SIGINT $PID
}

program &
PID=$!

trap handler SIGINT

wait $PID

#do some other cleanup with results from program

当我按ctrl + c时,将发送SIGINT到程序,但是bash将跳过wait,前提是程序已正确关闭并在其信号处理程序中创建了它的输出。

使用@suspectus答案,我可以将wait $PID更改为:
while kill -0 $PID > /dev/null 2>&1
do
    wait $PID
done

这实际上对我有用,我不是100%知道这是“干净”还是“肮脏的解决方法”。

最佳答案

陷阱将从处理程序返回,但是在调用处理程序时调用命令之后。

因此,解决方案有点笨拙,但我认为它可以满足要求。 trap handler INT也将起作用。

trap 'echo "Be patient"' INT

for ((n=20; n; n--))
do
    sleep 1
done

关于bash - 在bash中捕获SIGINT,处理并忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15785522/

10-11 15:37