谁能用简单的例子解释一下 exec 命令在 shell 脚本中的用途是什么?
exec内置命令镜像内核中的函数,有一个基于 的家族,通常execve从 C 中调用。
exec
execve
exec在当前进程中替换当前程序,而不fork创建新进程。您不会在编写的每个脚本中都使用它,但它有时会派上用场。以下是我使用过的一些场景;
fork
.profile
exec appln-program
所以现在没有shell可以回去了。即使appln-program崩溃,最终用户也无法访问 shell,因为它不存在 - 被exec替换了。
appln-program
我们想使用与 /etc/passwd 中的不同的 shell。尽管看起来很愚蠢,但有些网站不允许用户更改他们的登录 shell。我知道的一个网站让每个人csh都.login从ksh. 虽然这有效,但它留下了一个杂散的csh进程运行,并且注销是两个阶段,这可能会让人感到困惑。因此我们将其更改为exec ksh仅用 korn shell 替换了 c-shell 程序,并使一切变得更简单(这还有其他问题,例如它ksh不是登录 shell)。
csh
.login
ksh
exec ksh
只是为了节省流程。如果我们调用prog1 -> prog2 -> prog3 -> prog4etc. 并且永远不会返回,那么让每个调用都成为一个 exec。它节省了资源(不可否认,除非重复)并使关机更简单。
prog1 -> prog2 -> prog3 -> prog4
您显然已经exec在某处看到使用过,也许如果您展示了困扰您的代码,我们可以证明它的使用是合理的。
编辑 :我意识到我上面的答案是不完整的。在 shell中有 两种 用法,例如和- 用于打开文件描述符。这里有些例子:exec``ksh``bash
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 -u或print -u, on bash,例如:
read -u
print -u
bash
read <&3 echo stuff >&4