如何仅在命令完成时输出

how to output only when command finish

我 运行 多个命令使用 &:

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

这不是很好,因为输出行是交错的。我希望每个 curl 保留其输出,直到完成。怎么做?

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

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。
是的,您可以使用子 shell 命令 $() 嵌套 "" :)

缺点:这可能无法保留输出的顺序。如果第二个 curl 先完成,它会先输出。

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

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

\ 转义了换行符。没有 \ 一切都必须写在一行中。