这个问题源于这个以及其答案之一的推荐阅读Linuxtopia - 第 20 章. 子 shell。
我对 Linuxtopia 网站上的这个声明有点困惑:
子 shell 允许脚本进行并行处理,实际上是同时执行多个子任务。
https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.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 &
,但也在主壳和子壳之间建立了双向管道。