如何解决bash 函数、局部变量和退出代码
在 bash 函数中,我试图捕获命令的输出及其退出代码。一般来说,我的表格是
some_function() {
local rv=$(some_other_function)
local code=$?
echo "$rv"
return $code
}
但我注意到每当我使用“本地”时,然后 $?总是 0。就像它捕获分配的结果,而不是被调用的函数。 如果我不使用“本地”,那么它会按预期工作:
$ foo() { local rv=$(false); echo "code is $?"; }
$ foo
code is 0
$ foo() { rv=$(false); echo "code is $?"; }
$ foo
code is 1
谁能给我解释一下?显然这里有一些基本的东西,我只是不明白。
解决方法
有人可以向我解释一下吗?
简单来说,大多数时候 $?
具有执行的最后一个命令的退出状态。 last 命令是 local
。 local
的返回状态为零 - 它成功地使 rv
成为局部变量。愚蠢的例子:
echo $(false) $(true) $(false)
^^^^ - this is the last command executed
# $? here has exit status of **echo**
将分配与 local
分开:
local rv code
# Assignment is not a "command",in the sense it preserves exit status.
# The last command executed in assignment is the one inside `$(...)`.
rv=$(some_other_function)
code=$? # will have the exit status of expression executed inside $(...)
使用 http://shellcheck.net 检查您的脚本。 Shellcheck 会警告此类错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。