在bash中理解exec

时间:2017-01-12 00:19:56

标签: linux bash exec io-redirection process-substitution

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

1 个答案:

答案 0 :(得分:6)

以下是exec的作用:

  1. 设置当前进程中的所有重定向。
    • 对于open
    • 等大多数操作,这是dup2close> foo系统调用的组合
    • pipe + fork + /dev/fd/*用于流程替代
    • 为here-documents和here-strings
    • 创建并打开临时文件
  2. 将过程映像(使用execve)替换为指定程序(如果有)
  3. 如果您没有指定要运行的程序,则只需跳过步骤2,因此所有重定向都会影响脚本的其余部分。

    <(Process substitution)适用于pipe + fork + /dev/fd/

    1. 正常创建管道。
    2. 将其复制到FD 63或某处不会妨碍
    3. 分叉并运行一个读取/写入管道的程序。
    4. 将进程替换替换为/dev/fd/63,这是一个在打开时将返回FD 63的特殊文件。 (尝试echo <(ls))。
    5. 从那时起,它就像从任何其他文件重定向一样。您打开/dev/fd/63以便在FD 3上阅读,然后您最终从管道中读取。 exec因此不需要做任何特别的事情。