exec < 文件名 - 这是做什么的?

NWS*_*NWS 3 shell io-redirection shell-script

我发现了以下代码片段(sh):

    TESTFILE=$TEST_PATH/test.out
    if [ -f $TESTFILE ]
    then
        exec < $TESTFILE
    else
        echo "$TEST_PATH: no test.out file"
    fi
Run Code Online (Sandbox Code Playgroud)

我的问题的重点是,这条线在做什么?(其余的我明白了!)

        exec < $TESTFILE
Run Code Online (Sandbox Code Playgroud)

该文件不可执行,也未调用另一个进程,我无法找到 exec 对纯文本文件执行的操作。

Ala*_*rry 10

观察这种模式可能有助于直观理解:

cmd                  # fork; execute cmd in child
cmd < /dev/null      # fork; redirect stdin and execute cmd in child
exec cmd             # execute cmd; no fork
exec cmd < /dev/null # redirect stdin and execute cmd; no fork
exec < /dev/null     # redirect stdin; no fork and no execution
Run Code Online (Sandbox Code Playgroud)

看,exec还真不是事儿。这是一个反的东西。它根本不意味着“执行”。意思是“不要分叉”。它使命令的重定向和/或命令执行发生在当前进程中。


jw0*_*013 7

来自 POSIX 的描述exec

exec - 执行命令并打开、关闭或复制文件描述符

在这种情况下,没有命令,因此只修改文件描述符。通常,您在命令行上编写的重定向会影响该行上的命令。 exec是如何在当前执行的 shell 上进行重定向。

  • 它不完全是空操作。其余的脚本将从 $TESTFILE 中选择它的标准输入,从这条指令开始,而不是之前的标准输入,大概是交互式脚本的键盘。 (3认同)