我在我的bash脚本这个失败的行
cp $a $b || (echo "error in line $LINENO (${FUNCNAME[0]})" && exit -1)
,我知道它失败了,因为我收到了味精,但是脚本继续运行。 为什么?
答案 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
如果集合,任何
trap
在ERR
是由外壳的功能,命令置换,并且在一个子shell环境执行的命令继承。在这种情况下,通常不会继承ERR
陷阱。
只要你的陷阱定义之前定义的选项,并且使用嵌套函数任何水平,你喜欢
set -E
trap cleanup ERR
cleanup() {
# clean-up actions
}
foo() {
# some incorrect commands
}
bar() {
# more incorrect commands
}
main() {
foo
bar
}