서브쉘 출력을 번들로 묶는 것이 가능합니까?

서브쉘 출력을 번들로 묶는 것이 가능합니까?

모든 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 {//}

관련 정보