了解 bash 中的 exec

Understanding exec in bash

看了explanations of how the exec builtin works in bash,明白了它的基本作用是在不fork的情况下替换当前进程。它似乎也用于重定向 I/O 和关闭当前进程中的文件描述符,这让我感到困惑。这是 exec 做的一些不相关的额外事情吗?放在"replacing the current process"的语境下能理解吗?以及当与流程替换相结合时,这是如何工作的,例如exec 3< <(my program)?

exec 的作用如下:

  1. 设置当前进程中的所有重定向。
    • 这是 opendup2close 系统调用的组合,适用于大多数操作,例如 > foo
    • pipe + fork + /dev/fd/* 用于进程替换
    • 为 here-documents 和 here-strings
    • 创建并打开了临时文件
  2. 用指定的程序替换过程映像(使用execve),如果有

如果您没有为 运行 指定程序,则会跳过第 2 步,因此所有重定向都会影响脚本的其余部分。

<(Process substitution) 作品 pipe+fork+/dev/fd/:

  1. 正常创建管道。
  2. 将其复制到 FD 63 或其他不会妨碍的地方
  3. Fork 和 运行 一个 reads/writes 到管道的程序。
  4. 将进程替换替换为 /dev/fd/63,一个打开时将 return FD 63 的特殊文件。 (尝试 echo <(ls))。

从那时起,它就像从任何其他文件重定向一样工作。您打开 /dev/fd/63 以在 FD 3 上读取,然后您最终从管道读取。 exec 因此不需要做任何特别的事情。