1

如果发生故障,我打算使用陷阱执行一些清理代码。我有以下代码,但似乎有一些语法问题。

#!/bin/bash

set -e

function handle_error {
    umount /mnt/chroot
    losetup -d $LOOP_DEV1 $LOOP_DEV2
}

trap "{ echo \"$BASH_COMMAND failed with status code $?\"; handle_error; }" ERR

有没有人看到陷阱的编写方式有问题。如果出现错误,陷阱确实可以正常执行,但它还会在下面抛出另一个不需要的错误消息。

/root/myscript.sh: line 60: } ERR with status code 0: command not found
##line 60 is that line of code that exited with a non zero status

如何正确编写以避免错误消息?另外,如果我必须将参数 $LOOP_DEV1 和 $LOOP_DEV2 从主脚本发送到陷阱然后发送到 handle_error 函数怎么办?现在它们在主脚本中作为环境变量导出。我搜索了一些陷阱示例,但找不到类似的东西。

编辑

我将 shebang 从 /bin/sh 更改为 /bin/bash。由于 /bin/sh 已经与 bash 符号链接,我没想到会有独角兽,也没有看到任何独角兽。

4

1 回答 1

2

该陷阱调用正在创建一个有趣的递归,因为$BASH_COMMAND(and ) 在命令执行$?时被扩展。trap但是,$BASH_COMMAND此时是陷阱命令本身,文本包括$BASH_COMMAND(以及一些引号和分号)。实际上弄清楚陷阱触发时要执行的命令是一项有趣的研究,但没有必要解决问题,您可以这样做:

trap '{ echo "$BASH_COMMAND failed with status code $?"; handle_error; }' ERR

请注意,替换"with'不仅可以避免直接参数扩展,还可以避免必须转义内部"s。

于 2013-07-14T06:40:40.043 回答