我们正在尝试捕获 exec 命令的返回代码,但是一旦执行该命令,脚本就会退出,而不会继续执行下一行。
exec /bin/sh -c $command > log.txt
rc=$?
if [ $rc -ne 0 ]; then echo "script failed"; exit 999 ; fi
Run Code Online (Sandbox Code Playgroud)
任何建议如何使“exec”命令执行,然后使下一组行继续
exec使用命令作为参数会将进程中运行的当前程序替换为指定命令,因此从调用 shell 脚本的角度来看,它永远不会返回,即使exec无法实际运行所请求的命令。
在您的场景中,您可能应该删除exec:
/bin/sh -c " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
Run Code Online (Sandbox Code Playgroud)
另请注意您忘记的引号$command以及前导空格,以避免$command以-. 并>&2确保错误被发送到 stderr。
错误代码从 999 更改为 99,因为任何高于 255 的值都会产生未指定的结果。
如果重点是让$command当前 shell 解释存储的 shell 代码,那么您可以使用eval:
eval " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
Run Code Online (Sandbox Code Playgroud)
或更好:
if ! eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
Run Code Online (Sandbox Code Playgroud)
请注意,在 POSIX 中sh,eval作为所谓的特殊内置函数,当它失败时(例如代码中存在语法错误或重定向失败时)也需要退出> log.txt。在这些情况下,script failed不会输出错误。这可以通过以下方法解决:
if ! command eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
Run Code Online (Sandbox Code Playgroud)
其中command前缀消除了以下特殊内置函数的特殊性。
zsh如果不在仿真中,则不能使用它sh。