![서브쉘 출력을 번들로 묶는 것이 가능합니까?](https://linux55.com/image/210527/%EC%84%9C%EB%B8%8C%EC%89%98%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%B2%88%EB%93%A4%EB%A1%9C%20%EB%AC%B6%EB%8A%94%20%EA%B2%83%EC%9D%B4%20%EA%B0%80%EB%8A%A5%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
모든 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 {//}