当使用 运行命令时exec
,父 shell 将在命令运行完成后退出。如何判断执行的命令exec
是否成功运行?
答案1
当你成功使用后exec
,exec
'd程序取代你的外壳。 'd程序exec
的退出状态被发送回执行 shell 的父进程。
exec 的退出状态可以通过以下行解释的唯一方法exec
是 exec 调用失败,通常仅当请求的命令不存在或文件不可执行时。这不包括选项解析问题,因为这些问题是由 exec 程序启动后解析的。
如果您希望 shell 解释程序的退出代码,则不能使用exec
to 来执行此操作。只需在 shell 中运行该程序,完成后您就可以查看退出状态。
欲了解更多信息,您可以查阅man 3 exec
,这个或其姊妹函数之一是您的 shell 调用的基本低级 Unix 函数。
我能想到的从 shell 命令行使用的唯一合理原因exec
是在一台内存极低的机器上,其中 shell 使用的内存是一个问题,或者在一台存在分叉问题的机器上,你很幸运有一个shell 中,您不能派生任何新进程,并且只需要一个新进程来纠正问题。
例如,exec 的正常使用是在 shell 脚本中
(感谢@chicks)在登录脚本中将控制台委托给不太受信任的用户;当应用程序终止时,用户不可能获得 shell 的控制权
在只为 exec'd 程序设置先决条件(环境、ulimit)的 shell 脚本中,并且您希望 exec'd 程序的返回代码直接返回给调用您的脚本的人。由于执行的进程具有相同的 PID,因此脚本可以记录该进程。
答案2
根据执行手册页:
如果命令已指定,
exec
不得返回 shell ...
所以你可以在之后得到一些代码exec
。如果到达此代码,则表示出现了问题。
exec foo
ret=$?
## foo was not executed.
否则 shell 调用的调用脚本exec
可能会从命令中获取状态foo
。
例如,bash1
调用bash2
、bash2
调用,exec foo
如上所述。
在这种情况下,bash1
将从 获取返回码foo
。
bash2
将从调用中得到任何错误exec foo
。
答案3
您可以使用执行的命令的退出状态来exec
查看它是否有效,前提是该命令使用其自己的退出状态执行明智的操作,并且您想知道的内容足够简单,可以在退出状态中进行编码。
在我看来,就像bash
exec
保留了执行命令的 stdout 和 stderr 。我认为您可以使用执行的命令的输出来exec
查看它是否有效。
在我看来,它也像bash
检查要执行的命令的权限,因此如果您给它一个没有执行或读取权限的文件,您会得到一些输出。