退出使用$()的bash脚本

Ale*_*kov 2 bash

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

function err {
    printf "\e[31m$1\e[0m\n" 1>&2
    exit 1
}
Run Code Online (Sandbox Code Playgroud)

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

item=$(myfunc $1)
Run Code Online (Sandbox Code Playgroud)

通常情况下,该行正常工作,myfunc的STDOUT $item按预期转入.myfunc通过err上面看到的函数抛出错误时会出现问题.在$()结束了吞咽不回零和退出脚本本身守着退出.如果我理解正确,问题是$()实际上产生了一个新的子shell(就像被弃用的反引号一样),但我知道没有其他方法可以将函数的输出捕获到bash中允许其exit工作的变量中.

我也尝试使用set -e,也没有运气.有人可以建议如何构建我的错误处理程序,以便它甚至在这些情况下退出脚本?

Jon*_*ler 5

您可以测试作业的结果:

if item=$(myfunc "$1")
then : Function worked
else : Function failed
fi
Run Code Online (Sandbox Code Playgroud)

这将测试在使用的子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
$
Run Code Online (Sandbox Code Playgroud)

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

$ 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
$
Run Code Online (Sandbox Code Playgroud)

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