在bash中理解exec

Kva*_*ass 2 linux bash exec io-redirection process-substitution

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

tha*_*guy 6

这是做什么的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/63FD 3阅读,然后你最终从管道读取.exec因此不需要做任何特别的事情.