2

在阅读了关于 exec 内置如何在 bash 中工作的解释后,我了解到它的基本功能是在不分叉的情况下替换当前进程。它似乎也用于在当前进程中重定向 I/O 和关闭文件描述符,这让我感到困惑。这是一些不相关的额外事情exec吗?可以在“替换当前流程”的背景下理解吗?当与流程替换结合使用时,它是如何工作的,例如exec 3< <(my program)

4

1 回答 1

7

这是做什么的exec

  1. 在当前进程中设置所有重定向。
    • 这是大多数操作的open,dup2和系统调用的组合,例如close> foo
    • pipe++用于进程fork替换/dev/fd/*
    • 为 here-documents 和 here-strings 创建和打开临时文件
  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因此不需要做任何特别的事情。

于 2017-01-12T00:36:31.433 回答