11

我有一堆通用的清理代码,每当某个 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;不会改变任何内容。我错过了什么?

干杯!

4

1 回答 1

21

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

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

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

于 2012-02-10T16:50:16.367 回答