如何使 sh 脚本 return 成为执行命令的错误代码?

How to make the sh script return an error code from the executed command?

我写了一个简单的脚本来提示 pppd 工作。我在 pppd 文档中读到它可以 return 1-20 范围内的退出代码。如果 pppd 的值不为 0,我希望我的脚本 return pppd 的值。我尝试过这种方式,但不幸的是它失败了。

myscript.sh:

#!/bin/sh

exec pppd call ${@:-provider}
if [ $? !-eq 0 ]
then
  exit $?
fi

如何从 pppd 获取退出代码?

就这样:

#!/bin/sh

pppd call "${@:-provider}" || exit
...

if pppd call "${@:-provider}"; then : ; else exit; fi

如果pppd 失败,脚本将退出并且它的值returns 将是pppd 返回的值。 (您可以显式地写 exit $?,但这是在没有给出参数时 exit 返回的默认值,也不是必需的。)如果 pppd 成功,脚本将继续。

您的脚本的问题(除了不明智地使用 exec,我通常会忽略它)是调用 [ $? -ne 0 ] 会重置 $?。您可以将脚本重写为:

#!/bin/sh

pppd call "${@:-provider}"
save_val=$?
if ! [ $save_val -eq 0 ]
then
  exit $save_val
fi

但这似乎过于冗长。

请注意,在您的原始脚本中,您会在行 if [ $? !-eq 0 ] 上遇到错误,因为 !-eq 不是有效的运算符。但是,您永远不会看到该错误,因为您对 exec 的早期调用使得它永远不会执行该行。