在Bash中,当用户按下Ctrl+C时,终止当前正在运行的进程的缺省操作是向进程发送SIGINT信号。对于包含子进程的Bash函数,SIGINT信号的处理方式在不同的环境中可能会产生不一致的结果,例如在终端中直接运行函数和在脚本中调用函数等情况下。
以下是一种解决方法,可以确保在各种情况下,当用户按下Ctrl+C时,函数及其所有子进程都将正确地退出。
#!/bin/bash
function my_function() {
# 处理 SIGINT 信号
trap "kill 0" SIGINT
# 启动一个子进程并等待它完成
(command1; command2) &
wait
}
# 调用函数
my_function
在这个例子中,我们首先在函数中处理了SIGINT信号,使用trap
命令并将其绑定到kill 0
。这将在用户按下Ctrl+C时杀死当前进程及其所有子进程。
接下来,我们启动了一个子进程并将它放入后台,这样我们就可以在主进程中处理后续命令。
最后,我们使用wait
命令等待所有子进程完成。在这个过程中,如果接收到SIGINT信号,trap
命令将杀死当前进程及其所有子进程,确保我们的函数在任何情况下都能正确地退出。