この問題は、以下に由来します。これ答えの1つについて読むことをお勧めします。Linuxtopia - 第20章。サブシェル。
私はLinuxtopiaのウェブサイトの次の文に少し混乱しています:
サブシェルを使用すると、スクリプトを並列に処理でき、デフォルトで複数のサブタスクを同時に実行できます。
https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.html
これは、スクリプトで実行されるサブシェルが常に元のスクリプトと並列に実行されることを意味しますか?実験的にはそうではないようですが、専門家の確認をお願いします。
#! /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のウェブサイトを使うの&
は」[Let] スクリプトが並列に処理されます。「?
注:私は&
bashのpostfixコマンドの概念に精通しています。 bashはそのコマンドをバックグラウンドプロセスとして実行します。だから私の質問は、サブシェルで実行されるコマンドがバックグラウンド/パラレルプロセスとして実行されるかどうかについてです。基本的にまたは、ここに追加すると、&
バックグラウンド/パラレル実行が発生することがあります。私にとって、Linuxtopiaの記事の表現は前者を暗示していますが、これは観察と一致しないようです。
答え1
サブシェルの作成方法によって異なります。
( command )
サブシェルで実行され、command
続行する前にサブシェルが完了するのを待ちます。
command &
command
バックグラウンドのサブシェルで実行されます。シェルは、サブシェルが完了するのを待たずに次のコマンドを実行し続けます。これは並列処理に使用できます。
coproc command
に似ていますcommand &
が、プライマリシェルとサブシェルの間に双方向パイプも設定します。