所以第 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 并从那里调用清理函数即可。不要捕获一堆信号。