Bash 信号捕获未检测到声明 'trap' block 后更改的变量

标签 bash shell scope bash-trap

我有一堆通用的清理代码需要在某个 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/

相关文章:

linux - 为什么 "expr $n - 1"有效,而 "expr $n -1"无效?

bash - 查找:缺少 -exec 的参数

linux - 合并两个文件夹并保持文件同名

c++ - 与范围有关的局部变量定义,C++

c++ - 当 Injected-Class-Name 发生时会发生什么? (C++)

javascript - 如何从 Javascript 的内部函数访问父对象?

linux - 使用基于日期的shell脚本删除旧数据

linux - 发送modem AT指令及解析结果

linux - shell 遍历自定义数字列表

python - 如何修复输出文件不逐行破坏输出?