阅读explanations of how the exec builtin works in bash后,我了解到它的基本功能是在不分叉的情况下替换当前进程。它似乎也用于在当前进程中重定向I / O和关闭文件描述符,这让我感到困惑。这是一些不相关的额外事情exec
吗?能否在“取代现有流程”的背景下理解?如果与流程替换相结合,它是如何工作的,例如exec 3< <(my program)
?
答案 0 :(得分:6)
以下是exec
的作用:
open
dup2
,close
和> foo
系统调用的组合
pipe
+ fork
+ /dev/fd/*
用于流程替代execve
)替换为指定程序(如果有) 如果您没有指定要运行的程序,则只需跳过步骤2,因此所有重定向都会影响脚本的其余部分。
<(Process substitution)
适用于pipe
+ fork
+ /dev/fd/
:
/dev/fd/63
,这是一个在打开时将返回FD 63的特殊文件。 (尝试echo <(ls)
)。从那时起,它就像从任何其他文件重定向一样。您打开/dev/fd/63
以便在FD 3上阅读,然后您最终从管道中读取。 exec
因此不需要做任何特别的事情。