进程替换中的命令是否在子 shell 中调用?

进程替换中的命令是否在子 shell 中调用?

来自 bash 手册

工艺替代在支持的系统上受支持命名管道 (fifos) 或/dev/fd命名打开文件的方法。它采取以下形式

<(list)

或者

>(list)

进程列表的输入或输出连接到 fifo 或/dev/fd.该文件的名称作为扩展结果作为参数传递给当前命令。

该命令是list在进程替换中<(list)还是>(list)在子 shell 中调用,类似于命令替换、用括号分组的命令以及异步命令?与 bash 手册所述类似

命令替换、用括号分组的命令以及异步命令是在子 shell 环境中调用这是 shell 环境的副本,只不过 shell 捕获的陷阱被重置为 shell 在调用时从其父 shell 继承的值。

  1. 答案可能是肯定的,因为

    • 进程替换看起来类似于命令替换,

    • 一些来源

      其中的命令在后台运行。

    上面 bash 手册中的第二句话说命令替换和后台命令都是在子 shell 中调用的。

  2. 答案可能是否定的,因为

    • 在 bash 手册中,我没有看到 bash 手册的上述第二个引用中提到了进程替换,

    • 一些来源说过程替换

      对于绕过管道引起的子shell尤其重要

      虽然我不确定“绕过子 shell”是否意味着不在子 shell 中调用。

答案1

在下运行当前 shell strace(1),然后执行 eg <(command)给出:

克隆(child_stack = 0,标志= CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | SIGCHLD,child_tidptr = 0x7fa6713d59d0)= 13305

从纯粹定义的角度来看,因为克隆(2)定义为

创建一个子进程

和一个子外壳作为

运行 shell 脚本会启动一个新进程,即子 shell。

有人可能会说是的 - 正在运行的进程替换作为子 shell 被调用。

相关内容