我找到了以下代码片段(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 上进行重定向的方式。