我有一堆通用的清理代码需要在某个 bash 脚本退出时完成,无论它是正常退出还是被中断。我想我会使用 trap "..."EXIT
伪信号来实现这一点。
除了一般的清理工作外,还有一项特定的清理工作只有在脚本正常完成时才应进行。我想我可以通过让“陷阱” block 测试一个变量来触发它,就像这样:
#!/bin/bash
done=false;
trap "{
#generic cleanup code goes here.
if $done
then
#cleanup to be done only on completion goes here.
echo Test;
fi
}" EXIT
#main script goes here
done=true;
但是,这是行不通的。运行以下代码将永远不会回显“测试”。在 done=true;
之后添加显式 exit
调用不会改变任何内容。我错过了什么?
干杯!
最佳答案
陷阱正在被插值,并且在定义陷阱时而不是在执行时使用 $done 的值。您可以在陷阱定义周围使用单引号,或定义一个函数。定义函数可能更简洁:
#!/bin/sh
done=false
cleanup() { if test "$done" = true; then echo Test; fi; }
trap cleanup EXIT
done=true
这是有效的,因为函数中变量的扩展被推迟到函数被调用时,而不是在定义函数时。
关于Bash 信号捕获未检测到声明 'trap' block 后更改的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9230468/