我们正在尝试捕获 exec 命令的返回代码,但是一旦执行该命令,脚本就会退出,而不会继续执行下一行。
exec /bin/sh -c $command > log.txt
rc=$?
if [ $rc -ne 0 ]; then echo "script failed"; exit 999 ; fi
任何建议如何使“exec”命令执行,然后使下一组行继续
答案1
exec
使用命令作为参数会将进程中运行的当前程序替换为指定命令,因此从调用 shell 脚本的角度来看,它永远不会返回,即使exec
无法实际运行所请求的命令。
在您的场景中,您可能应该删除exec
:
/bin/sh -c " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
另请注意您忘记的引号$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
或更好:
if ! eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
请注意,在 POSIX 中sh
,eval
也是所谓的特别的> log.txt
当内置函数失败时,例如代码中存在语法错误或重定向失败时,也需要退出。在这些情况下,script failed
不会输出错误。这可以通过以下方法解决:
if ! command eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
command
前缀删除的地方特殊性到以下特殊内置命令。
zsh
如果不在仿真中,则不能使用它sh
。