我可以使用标准输入选项更改 Bash 中的陷阱操作吗?

我可以使用标准输入选项更改 Bash 中的陷阱操作吗?

通过选项,我想更改脚本退出或崩溃时发生的情况,例如,如果不是干净退出,则不清理日志和临时文件。

我知道我可以在陷阱的操作中调用函数。但是,因为这些通常需要在进入脚本的程序/指令部分之前进行处理。我需要使用稍后评估的变量。

据我了解,诸如函数之类的东西会被加载到内存中,并且在再次读取脚本本身之前不会再次读取。

行得通吗- 如果不 -有办法做到吗?谢谢。

答案1

如果我正确理解你的问题,你想在一个未经修改的 shell 脚本中“注入”行为。

检查 bash 手册页,查找BASH_ENV.引用的文件将在实际脚本之前执行。根据现有脚本在运行时执行的操作,您也许能够以这种方式调整其行为。

此示例创建一个BASH_ENV脚本和实际脚本。如您所见,trap中的代码设置的内容BASH_ENV被执行。

set -ex
read td < <(mktemp --directory --tmpdir=/dev/shm .XXX)
trap "rm -rf ${td}" EXIT
t_BASH_ENV="${td}/BASH_ENV"
t_BASH_SCRIPT="${td}/BASH_SCRIPT"
cat > ${t_BASH_ENV} <<'_EOF_'
: t_BASH_ENV $PPID $$
trap ": trapped t_BASH_ENV $PPID $$" EXIT
_EOF_
cat > ${t_BASH_SCRIPT} <<'_EOF_'
: t_BASH_SCRIPT $PPID $$
_EOF_
env -i BASH_ENV=${t_BASH_ENV} bash -x "${t_BASH_SCRIPT}"

输出:

+ read td
++ mktemp --directory --tmpdir=/dev/shm .XXX
+ trap 'rm -rf /dev/shm/.vJp' EXIT
+ t_BASH_ENV=/dev/shm/.vJp/BASH_ENV
+ t_BASH_SCRIPT=/dev/shm/.vJp/BASH_SCRIPT
+ cat
+ cat
+ env -i BASH_ENV=/dev/shm/.vJp/BASH_ENV bash -x /dev/shm/.vJp/BASH_SCRIPT
+ : t_BASH_ENV 4438 4443
+ trap ': trapped t_BASH_ENV 4438 4443' EXIT
+ : t_BASH_SCRIPT 4438 4443
+ : trapped t_BASH_ENV 4438 4443
+ rm -rf /dev/shm/.vJp

HTH。

相关内容