是否可以捆绑 subshel​​l 输出?

是否可以捆绑 subshel​​l 输出?

我有这个代码来检查我所有 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

默认情况下会对输出进行分组。

你甚至可以让 GNU Parallel 计算 $parent:

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

相关内容