exec脚本在shell脚本中有什么用处?

任何人都可以用简单的例子来解释exec命令在shell脚本中的用途吗?


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

exec取代当前进程中的当前程序,而无需fork新的进程。 这不是你在每个你写的脚本中都会用到的东西,但它偶尔会派上用场。 以下是我使用过的一些场景;

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

     exec appln-program
    

    所以现在没有可以返回的shell。 即使appln-program崩溃,最终用户也无法进入shell,因为它不在那里 - exec被替换exec了。

  • 我们想要在/ etc / passwd中使用不同的shell。 看起来很愚蠢,有些网站不允许用户改变他们的登录shell。 我知道的一个站点每个人都以csh开头,每个人都只需在他们的.login (csh启动文件)中调用ksh 。 虽然这有效,但遗留下了一个流氓csh进程,注销是两个阶段,可能会让人困惑。 所以我们把它改成了exec ksh ,它只是用korn shell取代了c-shell程序,并且简化了一切(还有其他一些问题,例如ksh不是登录shell)。

  • 只是为了保存过程。 如果我们调用prog1 -> prog2 -> prog3 -> prog4等,并且永远不会返回,那么使每个调用都成为exec。 它节省了资源(不是很多,当然,除非重复)并使关机更简单。

  • 你很明显看到某个地方使用了exec ,也许如果你显示的代码在困扰你,我们可以证明它的用途。

    编辑 :我意识到我上面的答案是不完整的。 有两种使用exec像炮弹kshbash -用于打开文件描述符。 这里有些例子:

    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 ,对bash ,例如:

    read <&3
    echo stuff >&4
    

    为了用一个简短的新手友好的简短答案来增加接受的答案,你可能不需要exec

    如果你还在这里,下面的讨论应该有希望揭示为什么。 当你跑步时,比如说,

    sh -c 'command'
    

    您运行sh实例,然后将该command作为该sh实例的子sh启动。 当command结束时, sh实例也结束。

    sh -c 'exec command'
    

    运行sh实例,然后用command二进制替换该sh实例,然后运行它。

    当然,在这个有限的背景下,这两者都是无用的; 你只是想要

    command
    

    在某些情况下,您希望shell读取其配置文件或以某种方式设置环境作为运行command的准备。 这几乎是exec command有用的唯一情况。

    #!/bin/sh
    ENVIRONMENT=$(some complex task)
    exec command
    

    这做了一些准备环境的东西,以便它包含所需的东西。 一旦这样做了,在sh实例不再是必要的,所以这是一个(小)优化只需更换sh与实例command的过程,而不是让sh立即运行它作为一个子进程,并等待它,然后退出完成后。

    同样,如果您想在shell脚本的最后释放尽可能多的资源以执行繁重的命令,则可能需要将该命令作为优化来exec

    如果有东西强迫你运行sh但你真的想运行其他东西,那么exec something else当然是一个解决方法来替换不需要的sh实例(例如,如果你真的想运行你自己的漂亮gosh而不是sh但你的不是sh没有在/etc/shells列出,所以你不能将它指定为登录shell)。

    第二次使用exec来操作文件描述符是一个单独的主题。 被接受的答案很好地涵盖了这一点; 为了保持这种独立性,我只需按照手册中的说明exec任何操作,其中exec后跟重定向而不是命令名。

    链接地址: http://www.djcxy.com/p/97103.html

    上一篇: What are the uses of the exec command in shell scripts?

    下一篇: How to determine the current shell I'm working on?