在阅读了关于 exec 内置如何在 bash 中工作的解释后,我了解到它的基本功能是在不分叉的情况下替换当前进程。它似乎也用于在当前进程中重定向 I/O 和关闭文件描述符,这让我感到困惑。这是一些不相关的额外事情exec
吗?可以在“替换当前流程”的背景下理解吗?当与流程替换结合使用时,它是如何工作的,例如exec 3< <(my program)
?
问问题
242 次
1 回答
7
这是做什么的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
因此不需要做任何特别的事情。
于 2017-01-12T00:36:31.433 回答