如何仅在命令完成时输出
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
\
转义了换行符。没有 \
一切都必须写在一行中。
我 运行 多个命令使用 &
:
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
\
转义了换行符。没有 \
一切都必须写在一行中。