在这个脚本中,它会拉取所有 git 存储库:
#!/bin/bash
find / -type d -name .git 2>/dev/null |
while read gitFolder; do
if [[ $gitFolder == *"/Temp/"* ]]; then
continue;
fi
if [[ $gitFolder == *"/Trash/"* ]]; then
continue;
fi
if [[ $gitFolder == *"/opt/"* ]]; then
continue;
fi
parent=$(dirname $gitFolder);
echo "";
echo $parent;
(git -C $parent pull && echo "Got $parent") &
done
wait
echo "Got all"
不wait
等待所有git pull
子shell。
为什么会这样,我该如何解决?
问题是
wait
由错误的shell进程运行。在bash
中,管道的每个部分都在单独的子外壳中运行。后台任务属于执行while
循环的子shell。将其wait
移入该子外壳将使其按预期工作:您还有一些未加引号的变量。
我会完全摆脱管道,而是
find
直接运行循环,这样就不需要解析find
.或者,
-prune
用于避免进入我们不想处理的任何子目录,正如评论中提到的,您还可以
xargs
更好地控制并发运行的git
进程数。下面使用的-P
选项(用于指定并发任务的数量)是非标准的,-0
(用于读取\0
- 分隔的路径名)和-r
(用于避免在没有输入时运行命令)也是如此。不过, GNUxargs
和该实用程序的其他一些实现具有这些选项。此外,(to output -delimited pathnames) 的-print0
谓词是非标准的,但通常实现。find
\0
我确信 GNU
parallel
也可以以类似的方式使用,但由于这不是这个问题的主要焦点,所以我不追求那种思路。