默认情况下,子 shell 是并行运行的吗?

默认情况下,子 shell 是并行运行的吗?

这个问题源于这个以及其答案之一的推荐阅读Linuxtopia - 第 20 章. 子 shell

我对 Linuxtopia 网站上的这个声明有点困惑:

子 shell 允许脚本进行并行处理,实际上是同时执行多个子任务。
https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshel​​ls.html

这是否意味着从脚本运行的子 shell 始终与原始脚本并行运行?从实验来看,情况似乎并非如此,但我将不胜感激专家的确认。

#! /usr/bin/bash

# This script reliably prints:
# hello
# world
# 0
# ...implying that the the subshell is not run in parallel with this script.

(echo hello;
echo world)

echo $?

#! /usr/bin/bash

# This script prints:
# 0
# hello
# world
# ...implying that the the subshell is run in parallel with this script.

(echo hello;
echo world) &

echo $?

使用&Linuxtopia 网站可能表示的“[让]脚本进行并行处理“?


注意:我熟悉&bash 中后缀命令的概念...它将所述命令作为后台进程运行。所以我的问题更多是关于在子 shell 中执行的命令是否作为后台/并行进程运行默认情况下,或者如果此处的添加&也是导致后台/并行执行的原因。对我来说,Linuxtopia 文章的措辞暗示了前者,但这似乎与观察不符。

答案1

取决于您如何创建子shell。

( command )将在子 shell 中运行command并等待子 shell 完成后再继续。

command &command将在后台的子 shell 中运行。 shell 将继续执行下一个命令,而不等待子 shell 完成。这可以用于并行处理。

coproc command与 类似command &,但也在主壳和子壳之间建立了双向管道。

相关内容