我打算在发生故障时使用陷阱执行一些清理代码。我有以下代码,但它似乎有一些语法问题。bash中的陷阱语法问题
#!/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函数呢?现在它们被作为主脚本中的环境变量导出。我做了一些搜索陷阱的例子,但我无法得到类似的东西。
编辑
我从/ bin/sh的为/ bin/bash的改变的家当。由于/ bin/sh已经符合bash的标准,我没有想到独角兽也没有看到任何东西。
如果脚本实际上是用'sh'而不是'bash'执行的,则需要用'handle_error(){'定义函数。 'function'关键字是一个'bash'扩展名。 – chepner
@chepner在大多数情况下,不是/ bin/sh连接到bash的sym链接?至少在我的系统中似乎是这种情况。 –
如果你使用Bash语法,那么你应该在shbang行中指定'#!/ bin/bash',即使'/ bin/sh'是'/ bin/bash'的符号链接。那样的话,如果你的脚本曾经在'/ bin/sh'不是'/ bin/bash'的系统上运行,它仍然可以正常工作。 –