Bash - 子プロセスから親プロセスに値を返す

Bash - 子プロセスから親プロセスに値を返す

私は以下のコードを使用しています

record_count=0
task()
{
while read -r record ; do
record_count=$(( record_count + 1 ))
.....
done < $1
}

for i in {1..5}; do
task $i &
done

サブシェル\子プロセスから親シェル\プロセスへの record_count を使用するにはどうすればよいでしょうか。試してみましたがreturn record_count、うまくいきませんでした。値を返す別の方法はありますか (可能であれば、複数の値を返す)

答え1

「return」は終了コード用で、通常「0」は成功を示し、それ以外は失敗を示します。また、256 未満の整数である必要があるため、通常、ここで期待される種類の結果を返すのには役立ちません。

ただし、サブプロセスは結果をテキストとして生成することができ、メインプロセスはオプションでその結果をキャプチャできます。

record_count=0
task()
{
    while read -r record
    do
        record_count=$(( record_count + 1 ))
    done <$1
    echo $record_count
}

(
    for i in {1..5}
    do
        task $i &
    done
    wait
) \
| sort

「待機」により、続行する前にすべてのサブプロセスが完了していることを確認します。

並列プロセスでは、どの順序で終了するかは保証されないため、結果が必ずしも 1、2、3、4、5 の順序で表示されるわけではないことに注意してください。

ランダムな順序が問題になる場合は、プログラムがタスクに「キー」を渡し、そのキーを使用して出力をソートすることができます。この場合、$i 自体がキーになることがあります。ただし、一般にファイル名は単純な整数ではありません。

答え2

return record_count数値が 0 から 255 の間の場合にのみ使用して正しい結果を得ることができます。戻りコードは次のように使用する必要があります。

for i in {1..5}; do
task $i ; echo $?
done

関連情報