如何仅在命令完成时输出

我使用&运行多个命令:

 curl "url1" --output /dev/null 2>> out & curl "url1" --output /dev/null 2>> out & wait 

这不能很好地工作,因为输出行是交错的。 我希望每个curl都能保持它的输出,直到完成。 怎么做?

我知道我可以使用临时文件,concat在一起,然后删除。 有更好的方法吗?

 curl "url1" --output /dev/null 2>> out1 & curl "url1" --output /dev/null 2>> out2 & wait 

你可以在子shell中执行每个curl

 echo "$(curl "url1" 2>&1 >/dev/null)" >> out & echo "$(curl "url2" 2>&1 >/dev/null)" >> out & wait 

2>&1将stderr重定向到stdout。
是的,你可以使用subshel​​l命令$() :)嵌套""

下行:这可能无法保持产出的顺序。 第二次curl首先完成时,首先输出。

为了保持输出的顺序,你可以使用cat<() 。 Bash的进程替换 <(COMMAND)COMMAND的输出创建一个临时文件(实际上是一个FIFO),但不必关心该临时文件的名称,创建和删除。

 cat \ <(curl "url1" 2>&1 >/dev/null) \ <(curl "url2" 2>&1 >/dev/null) \ > out 

逃避换行符。 没有“一切”必须写在一条线上。