了解 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
的作用如下:
- 设置当前进程中的所有重定向。
- 这是
open
、dup2
和 close
系统调用的组合,适用于大多数操作,例如 > foo
pipe
+ fork
+ /dev/fd/*
用于进程替换
- 为 here-documents 和 here-strings
创建并打开了临时文件
- 用指定的程序替换过程映像(使用
execve
),如果有
如果您没有为 运行 指定程序,则会跳过第 2 步,因此所有重定向都会影响脚本的其余部分。
<(Process substitution)
作品 pipe
+fork
+/dev/fd/
:
- 正常创建管道。
- 将其复制到 FD 63 或其他不会妨碍的地方
- Fork 和 运行 一个 reads/writes 到管道的程序。
- 将进程替换替换为
/dev/fd/63
,一个打开时将 return FD 63 的特殊文件。 (尝试 echo <(ls)
)。
从那时起,它就像从任何其他文件重定向一样工作。您打开 /dev/fd/63
以在 FD 3 上读取,然后您最终从管道读取。 exec
因此不需要做任何特别的事情。
看了explanations of how the exec builtin works in bash,明白了它的基本作用是在不fork的情况下替换当前进程。它似乎也用于重定向 I/O 和关闭当前进程中的文件描述符,这让我感到困惑。这是 exec
做的一些不相关的额外事情吗?放在"replacing the current process"的语境下能理解吗?以及当与流程替换相结合时,这是如何工作的,例如exec 3< <(my program)
?
exec
的作用如下:
- 设置当前进程中的所有重定向。
- 这是
open
、dup2
和close
系统调用的组合,适用于大多数操作,例如> foo
pipe
+fork
+/dev/fd/*
用于进程替换- 为 here-documents 和 here-strings 创建并打开了临时文件
- 这是
- 用指定的程序替换过程映像(使用
execve
),如果有
如果您没有为 运行 指定程序,则会跳过第 2 步,因此所有重定向都会影响脚本的其余部分。
<(Process substitution)
作品 pipe
+fork
+/dev/fd/
:
- 正常创建管道。
- 将其复制到 FD 63 或其他不会妨碍的地方
- Fork 和 运行 一个 reads/writes 到管道的程序。
- 将进程替换替换为
/dev/fd/63
,一个打开时将 return FD 63 的特殊文件。 (尝试echo <(ls)
)。
从那时起,它就像从任何其他文件重定向一样工作。您打开 /dev/fd/63
以在 FD 3 上读取,然后您最终从管道读取。 exec
因此不需要做任何特别的事情。