退出使用$()的bash脚本

时间:2015-10-06 03:58:28

标签: bash

我的印象是exit无论如何都会终止当前的bash脚本,并且在我的脚本顶部有以下错误处理程序:

function err {
    printf "\e[31m$1\e[0m\n" 1>&2
    exit 1
}

对于大多数情况来说,它就像一个魅力,直到这一行:

item=$(myfunc $1)

通常,该行正常工作,myfunc的STDOUT按预期转储到$item。当myfunc通过上面看到的err函数抛出错误时会出现问题。 $()最终会吞下非零返回并保护退出退出脚本本身。如果我理解正确,问题是$()实际上产生了一个新的子shell(就像被弃用的反引号一样),但我知道没有其他方法可以将函数的输出捕获到bash中允许{的变量{1}}工作。

我也试过使用exit,但也没有运气。有人可以建议如何构建我的错误处理程序,以便即使在这些情况下它也会退出脚本吗?

2 个答案:

答案 0 :(得分:5)

您可以测试作业的结果:

if item=$(myfunc "$1")
then : Function worked
else : Function failed
fi

这将测试$(…)使用的子shell中运行的命令的退出状态。

如果没有实际使用功能,您可以尝试:

$ if item=$(echo Hi; exit 1); then echo "$item - OK"; else echo "$item - OH"; fi
Hi - OH
$ if item=$(echo Hi; exit 0); then echo "$item - OK"; else echo "$item - OH"; fi
Hi - OK
$

或者,如果功能被认为是至关重要的,那么:

$ err() { exit $1; }
$ myfunc() { echo Mine; err $1; }
$ if item=$(myfunc 1); then echo "$item - OK"; else echo "$item - OH"; fi
Mine - OH
$ if item=$(myfunc 0); then echo "$item - OK"; else echo "$item - OH"; fi
Mine - OK
$

在Mac OS X 10.11 El Capitan上使用Bash 3.2.57进行测试。

答案 1 :(得分:0)

为了什么值得你也不能使用bash短路评估来测试函数的退出状态。它改为测试对变量的赋值。

例如。 而

[[ $(myfunc "$1") ]] && echo success || echo failure

[[ myfunc "$1" ]] && echo success || echo failure

相当普遍,可能会做出预期的事情,

[[ item=$(myfunc "$1") ]] && echo success || echo failure

即使myfunc返回非零,也始终返回成功。你必须使用if then else来测试退出状态。