了解bash中的exec

在阅读了关于exec内build工程的解释之后,我明白它的基本function是replace当前进程而不分叉。 它似乎也被用于redirectI / O和在当前进程中closures文件描述符,这使我感到困惑。 这是一些无关的额外的事情exec吗? 在“取代现在的过程”的背景下能够理解吗? 而如何结合进程替代,如exec 3< <(my program)

Solutions Collecting From Web of "了解bash中的exec"

这是exec做的事情:

  1. 设置当前进程中的所有重定向。
    • 这是对> foo等大多数操作的opendup2close系统调用的组合
    • pipe + fork + /dev/fd/*用于进程替换
    • 创建临时文件并为这里的文档和这里的字符串打开
  2. 将过程映像(使用execve )替换为指定的程序( 如果有的话)

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

<(Process substitution)通过pipe + fork + /dev/fd/

  1. 正常创建一个管道。
  2. 将其复制到FD 63或某个不会妨碍的地方
  3. 分叉并运行读取/写入管道的程序。
  4. /dev/fd/63替换进程替换,这是一个打开时将返回FD 63的特殊文件。 (尝试echo <(ls) )。

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