在声明'陷阱'块后,Bash信号捕获未检测到变量

时间:2012-02-10 15:46:09

标签: bash shell scope bash-trap

我有一堆通用的清理代码需要在某个bash脚本退出时完成,无论它是正常退出还是被中断。我想我会使用trap "..." EXIT伪信号来实现这一目标。

除了通用的清理工作之外,还有一个特定的清理工作,只有在脚本正常完成时才能完成。我认为我可以通过让'陷阱'块测试一个变量来触发它,如下所示:

#!/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;

然而,这不起作用。运行以下代码永远不会回显“测试”。在exit之后添加明确的done=true;调用不会改变任何内容。我错过了什么?

干杯!

1 个答案:

答案 0 :(得分:17)

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

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

这是有效的,因为在函数被调用之前,函数中的变量的扩展是延迟的,而不是在定义函数时。