2012-02-10 14 views
6

我有一堆通用清理代码,需要在某个bash脚本退出时执行,无论它是正常退出还是中断。我想我会用trap "..." EXIT pseudosignal来达到这个目的。在声明“陷阱”块后,Bash信号捕获未检测到变量

除了通用清理的东西,还有一个特定的清理应该只在脚本正常完成时完成。我想我可以通过让'陷阱'块测试一个变量来触发这种情况,如下所示:

#!/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调用不会更改任何内容。我错过了什么?

干杯!

回答

13

陷阱正在进行插值,并且正在使用陷阱定义时的$ done值而不是执行陷阱时的值。您可以在陷阱定义周围使用单引号,或者定义一个函数。定义一个函数可能是清洁剂:

 
#!/bin/sh 
done=false 
cleanup() { if $done; then echo Test; fi; } 
trap cleanup EXIT 
done=true 

这工作,因为变量在功能扩展将被推迟到函数被调用,而不是被定义的功能时。