如何判断 exec 执行的命令是否成功?

如何判断 exec 执行的命令是否成功?

当使用 运行命令时exec,父 shell 将在命令运行完成后退出。如何判断执行的命令exec是否成功运行?

答案1

当你成功使用后execexec'd程序取代你的外壳。 'd程序exec的退出状态被发送回执行 shell 的父进程。

exec 的退出状态可以通过以下行解释的唯一方法exec是 exec 调用失败,通常仅当请求的命令不存在或文件不可执行时。这不包括选项解析问题,因为这些问题是由 exec 程序启动后解析的。

如果您希望 shell 解释程序的退出代码,则不能使用execto 来执行此操作。只需在 shell 中运行该程序,完成后您就可以查看退出状态。

欲了解更多信息,您可以查阅man 3 exec,这个或其姊妹函数之一是您的 shell 调用的基本低级 Unix 函数。

我能想到的从 shell 命令行使用的唯一合理原因exec是在一台内存极低的机器上,其中 shell 使用的内存是一个问题,或者在一台存在分叉问题的机器上,你很幸运有一个shell 中,您不能派生任何新进程,并且只需要一个新进程来纠正问题。

例如,exec 的正常使用是在 shell 脚本中

  1. (感谢@chicks)在登录脚本中将控制台委托给不太受信任的用户;当应用程序终止时,用户不可能获得 shell 的控制权

  2. 在只为 exec'd 程序设置先决条件(环境、ulimit)的 shell 脚本中,并且您希望 exec'd 程序的返回代码直接返回给调用您的脚本的人。由于执行的进程具有相同的 PID,因此脚本可以记录该进程。

答案2

根据执行手册页:

如果命令已指定,exec不得返回 shell ...

所以你可以在之后得到一些代码exec。如果到达此代码,则表示出现了问题。

   exec foo
   ret=$?
   ## foo was not executed.

否则 shell 调用的调用脚本exec可能会从命令中获取状态foo

例如,bash1调用bash2bash2调用,exec foo如上所述。

在这种情况下,bash1将从 获取返回码foo。  bash2将从调用中得到任何错误exec foo

答案3

您可以使用执行的命令的退出状态来exec查看它是否有效,前提是该命令使用其自己的退出状态执行明智的操作,并且您想知道的内容足够简单,可以在退出状态中进行编码。

在我看来,就像bash exec保留了执行命令的 stdout 和 stderr 。我认为您可以使用执行的命令的输出来exec查看它是否有效。

在我看来,它也像bash检查要执行的命令的权限,因此如果您给它一个没有执行或读取权限的文件,您会得到一些输出。

相关内容