我正在使用 curl 获取 URL,然后写入文件,如下所示:
urls=(
'https://www.example1.com'
'https://www.example2.com'
)
for i in ${urls[@]}; do
curl $i &
done
echo 'stuff'
我特意简化了代码,因此可以解决确切的问题。
输出:
stuff
$curlContents1
$curlContents2
我知道为什么会发生这种情况,它是异步运行的。
我想知道的
- 我想运行这个异步 cmd,其输出与我同步运行它时的输出相同。
- 这是因为异步运行它可以提高速度
期望的输出:
$curlContents1
$curlContents2
stuff
更多信息
- 我的实际问题有点不同……
我正在做的是下载视频,然后获取 URL 的最后一部分并将其用作文件名,parallel
在此示例中如何使用?
写入发生在下载之前,因为下载是最耗时的部分
arr=(
'https://www.example1.com/stccdtu.mp4’
'https://www.example2.com/dyubdf.mp4’
)
for i in ${arr[@]}; do
curl $i > `echo $i | sed s'#https://www.example[0-9].com/##'g` &
done
输出:
ll
0 stccdtu.mp4
0 dyubdf.mp4
使用 GNU
parallel
。基本示例:-j 40
意味着我们分配了 40 个工作槽,即我们允许最多 40 个并行工作(根据您的需要和能力进行调整)。如果您提供更多 URL,则将在某个插槽可用后处理第 41 个 URL。所有 URL 都将被处理,但任何时候最多有 40 个作业并行运行。使用的其他选项:
(来源)
这是默认设置,因此通常您不必显式使用它。
(来源)
笔记:
在我的示例
parallel
中,它不在后台并且是同步运行的(所以echo
在它之后运行);仍然curl
是并行、异步运行的。在 Debian 中,GNU
parallel
位于一个名为parallel
. 该工具的基本变体(来自moreutils
,至少在 Debian 中)功能较弱。parallel
是外部命令。如果数组足够大,那么parallel … ::: "${urls[@]}"
你会命中argument list too long
. 改用这个:它将起作用,因为在 Bash
printf
中是内置的,因此之前的所有内容|
都由 Bash 在内部处理。${urls[@]}
被正确地双引号(在你的代码中${urls[@]}
并且$i
没有被引用,这是错误的)。GNU
parallel
可以调用导出的 Bash 函数。这使我们能够解决您所谓的实际问题:如果您不知道是什么
${1##*/}
,请阅读我的另一个答案。Bash shell 具有
wait
暂停脚本直到后台作业完成的命令。