在阅读了关于exec builtin如何在bash中工作的解释之后,我理解它的基本功能是在不分叉的情况下替换当前进程.它似乎也用于在当前进程中重定向I/O和关闭文件描述符,这让我感到困惑.这是一些无关的额外的事情exec
吗?能否在"取代现有流程"的背景下理解?如果与流程替换相结合,它是如何工作的,例如exec 3< <(my program)
?
这是做什么的exec
:
设置当前进程中的所有重定向.
这是一个组合open
,dup2
以及close
系统调用像大多数操作> foo
pipe
+ fork
+ /dev/fd/*
用于过程替代
为here-documents和here-strings创建并打开临时文件
将过程映像(使用execve
)替换为指定的程序(如果有)
如果您没有指定要运行的程序,则只需跳过步骤2,因此所有重定向都会影响脚本的其余部分.
<(Process substitution)
通过pipe
+ fork
+工作/dev/fd/
:
正常创建管道.
将它复制到FD 63或某处不会妨碍它
分叉并运行读取/写入管道的程序.
将进程替换替换为/dev/fd/63
一个特殊文件,该文件在打开时将返回FD 63.(试试echo <(ls)
)
从那时起,它就像从任何其他文件重定向一样.你打开/dev/fd/63
FD 3阅读,然后你最终从管道读取.exec
因此不需要做任何特别的事情.