bash的错误处理程序不会退出,但不打印错误味精

时间:2019-01-31 18:25:14

标签: bash

我在我的bash脚本这个失败的行

 cp $a $b || (echo "error in line $LINENO (${FUNCNAME[0]})" && exit -1)

,我知道它失败了,因为我收到了味精,但是脚本继续运行。 为什么?

2 个答案:

答案 0 :(得分:4)

您要退出由(...)创建的子Shell,而不是当前的Shell。请改用{...}

cp "$a" "$b" || { echo "..."; exit 1; }

请注意,退出状态应为0到255之间的整数。

答案 1 :(得分:1)

我喜欢设置trap运行清理功能,可打印的信息,因为你需要从脚本执行适当的退出。定义在ERR上进行陷印的条件(即在命令失败时)。见The trap builtin command对于其它信号可以作用于

trap cleanup ERR

并定义一个简单函数为

cleanup() {
    exitcode=$?
    printf 'exit code returned: %s\n' "$exitcode"
    printf 'the command executing at the time of the error was: %s\n' "$BASH_COMMAND"
    printf 'command present on line: %d\n' "${BASH_LINENO[0]}"
    # Some more clean up code can be added here before exiting
    exit $exitcode
}

尝试用这些行动定义这将准确地指向你的行号和导致该失败的命令再次运行失败cp命令。它的任务还包括定义trap,你怀疑可能的故障,而不是全局定义它的函数中定义。

shell提供了一个选项,trap由脚本中的所有函数继承。参见The set builtin

  

-E

     

如果集合,任何trapERR是由外壳的功能,命令置换,并且在一个子shell环境执行的命令继承。在这种情况下,通常不会继承ERR陷阱。

只要你的陷阱定义之前定义的选项,并且使用嵌套函数任何水平,你喜欢

set -E
trap cleanup ERR

cleanup() {
    # clean-up actions
}

foo() {
    # some incorrect commands
}

bar() {
    # more incorrect commands
}

main() {
    foo
    bar
}