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

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

我找到了以下代码片段(sh):

    TESTFILE=$TEST_PATH/test.out
    if [ -f $TESTFILE ]
    then
        exec < $TESTFILE
    else
        echo "$TEST_PATH: no test.out file"
    fi

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

        exec < $TESTFILE

该文件不可执行,也不会调用另一个进程,而且我没有运气找到 exec 对纯文本文件执行的操作。

答案1

观察以下模式可能有助于直观理解:

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

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

答案2

从 POSIX 的描述来看exec:

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

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

相关内容