Zac*_*c B 9 bash shell scope bash-trap
我有一堆通用的清理代码需要在某个bash脚本退出时完成,无论它是正常退出还是被中断.我想我会使用trap "..." EXIT伪信号来实现这一点.
除了通用的清理工作之外,还有一个特定的清理工作,只有在脚本正常完成时才能完成.我想我可以通过让'trap'块测试一个变量来触发这个,就像这样:
#!/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;
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.运行以下代码永远不会回显"测试".之后添加显式exit调用done=true;不会更改任何内容.我错过了什么?
干杯!
Wil*_*ell 17
正在插入陷阱,并且在定义陷阱时使用$ done的值而不是在执行陷阱时.您可以在陷阱定义周围使用单引号,或定义函数.定义一个函数可能更干净:
#!/bin/sh
done=false
cleanup() { if $done; then echo Test; fi; }
trap cleanup EXIT
done=true
这是有效的,因为函数中的变量的扩展被推迟到调用函数,而不是在定义函数时.