小编典典

shell 脚本中 exec 命令的用途是什么?

all

谁能用简单的例子解释一下 exec 命令在 shell 脚本中的用途是什么?


阅读 78

收藏
2022-05-05

共1个答案

小编典典

exec内置命令镜像内核中的函数,有一个基于 的家族,通常execve从 C 中调用。

exec在当前进程中替换当前程序,而不fork创建新进程。您不会在编写的每个脚本中都使用它,但它有时会派上用场。以下是我使用过的一些场景;

  1. 我们希望用户在不访问 shell 的情况下运行特定的应用程序。我们可以更改 /etc/passwd 中的登录程序,但也许我们希望从启动文件中使用环境设置。所以,在 (say).profile中,最后一条语句是这样说的:
     exec appln-program
    

所以现在没有shell可以回去了。即使appln-program崩溃,最终用户也无法访问 shell,因为它不存在 - 被exec替换了。

  1. 我们想使用与 /etc/passwd 中的不同的 shell。尽管看起来很愚蠢,但有些网站不允许用户更改他们的登录 shell。我知道的一个网站让每个人csh.loginksh. 虽然这有效,但它留下了一个杂散的csh进程运行,并且注销是两个阶段,这可能会让人感到困惑。因此我们将其更改为exec ksh仅用 korn shell 替换了 c-shell 程序,并使一切变得更简单(这还有其他问题,例如它ksh不是登录 shell)。

  2. 只是为了节省流程。如果我们调用prog1 -> prog2 -> prog3 -> prog4etc. 并且永远不会返回,那么让每个调用都成为一个 exec。它节省了资源(不可否认,除非重复)并使关机更简单。

您显然已经exec在某处看到使用过,也许如果您展示了困扰您的代码,我们可以证明它的使用是合理的。

编辑 :我意识到我上面的答案是不完整的。在 shell中有 两种 用法,例如和-
用于打开文件描述符。这里有些例子:exec``ksh``bash

exec 3< thisfile          # open "thisfile" for reading on file descriptor 3
exec 4> thatfile          # open "thatfile" for writing on file descriptor 4
exec 8<> tother           # open "tother" for reading and writing on fd 8
exec 6>> other            # open "other" for appending on file descriptor 6
exec 5<&0                 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4                 # copy write file descriptor 4 onto 7
exec 3<&-                 # close the read file descriptor 3
exec 6>&-                 # close the write file descriptor 6

请注意,间距在这里非常重要。如果在 fd 编号和重定向符号之间放置一个空格,则exec恢复为原始含义:

  exec 3 < thisfile       # oops, overwrite the current program with command "3"

有几种方法可以使用它们,在 ksh 上使用read -uprint -u, on bash,例如:

read <&3
echo stuff >&4
2022-05-05