捕获 SIGINT 以便进程自行终止

捕获 SIGINT 以便进程自行终止

所以第 5 节来自这里对我来说很有意义,我想实施它。我有这个 bash 脚本

#!/usr/bin/env bash

cp aux.sh aux.sh.bak

cleanup() {
    cp aux.sh.bak aux.sh
    rm -rf aux.sh.bak
}

trap 'cleanup; trap - SIGINT; kill -s SIGINT "$$"' SIGINT
trap cleanup EXIT

echo "Hold this for now" >> aux.sh

read -rp "Hit Enter to finish"

exit 0

但是,当运行它时,如果我按Ctrl+C我会收到以下错误:

Hit Enter to finish^Ccp: cannot stat 'aux.sh.bak': No such file or directory

我不知道为什么会发生这个错误。但我的猜测是,cleanup该命令的结果是再次运行kill

我究竟做错了什么?如何正确地做到这一点?

答案1

在 bash 中,EXIT无论退出原因如何,都会调用陷阱。在您的情况下,CtrlC导致SIGINT陷阱运行,然后当脚本终止自身时,EXIT陷阱运行。

正如您所怀疑的,该cleanup函数最终被调用两次。

您引用的 wiki 页面解释了如何处理此问题(仅在 bash 中):

因此,要进行清理,只需捕获 EXIT 并从那里调用清理函数即可。不要捕获一堆信号。

相关内容