サブシェル出力をバンドルすることは可能ですか?

サブシェル出力をバンドルすることは可能ですか?

すべてのgitフォルダの状態を確認するコードがあります。

find / -maxdepth 3 -not -path / -path '/[[:upper:]]*' -type d -name .git -not -path "*/Trash/*" -not -path "*/Temp/*" -not -path "*/opt/*" -print 2>/dev/null |
{
    while read gitFolder; do
        (
            parent=$(dirname $gitFolder);
            Status=$(git -C $parent status)
            if [[ $Status == *Changes* ]]; then
                echo $parent;
                git -C $parent status --porcelain
                echo ""
            elif [[ $Status == *ahead* ]]; then
                echo "Push $parent";
                echo
            elif [[ $Status == *diverged* ]]; then
                echo "Sync $parent";
                echo
            fi
        ) &
    done
    wait
}

順番に実行すると、端末で明確に読み取れる印刷結果が得られます。しかし、速度が遅くなりました。並列に実行すると(を使用して&)速度は本当に良くなりますが、出力がめちゃくちゃになります。

どういうわけか、各内部シェルの出力をロックし、各内部シェルの標準出力をブロックとして印刷できますか?

ベストアンサー1

GNU Parallelはまさに以下のために作られています。

doit() {
        gitFolder="$1"
        parent=$(dirname $gitFolder);
        Status=$(git -C $parent status)
        if [[ $Status == *Changes* ]]; then
            echo $parent;
            git -C $parent status --porcelain
            echo ""
        elif [[ $Status == *ahead* ]]; then
            echo "Push $parent";
            echo
        elif [[ $Status == *diverged* ]]; then
            echo "Sync $parent";
            echo
        fi
}
export -f doit
find / -maxdepth 3 -not -path / -path '/[[:upper:]]*' -type d -name .git -not -path "*/Trash/*" -not -path "*/Temp/*" -not -path "*/opt/*" -print 2>/dev/null |
  parallel -j0 doit

出力はデフォルトでグループ化されます。

$parentを計算するようにGNU Parallelに要求することもできます。

doit() {
        parent="$1"
        Status=$(git -C $parent status)
        :
}
... | parallel -j0 doit {//}

おすすめ記事