I’m running multiple commands using &
:
curl "url1" --output /dev/null 2>> out & curl "url1" --output /dev/null 2>> out & wait
This doesn’t work well because the output lines are interleaved. I want each curl
to hold its output, until it’s done. How to do that?
I understand I can use temp files, concat together and delete afterwards. Are there better ways?
curl "url1" --output /dev/null 2>> out1 & curl "url1" --output /dev/null 2>> out2 & wait
Advertisement
Answer
You could execute each curl
inside a subshell:
echo "$(curl "url1" 2>&1 >/dev/null)" >> out & echo "$(curl "url2" 2>&1 >/dev/null)" >> out & wait
2>&1
redirects stderr to stdout.
And yes, you can have nested ""
with the subshell command $()
🙂
Downside: This may not preserve the order of outputs. In case the second curl
completes first, it outputs first.
In order to keep the outputs ordered, you could use cat
and <()
. Bash’s process substitution <(COMMAND)
creates a temporary file (actually, it’s a FIFO) from the output of COMMAND
, but you don’t have to care about name, creation, and deletion of that temporary file.
cat <(curl "url1" 2>&1 >/dev/null) <(curl "url2" 2>&1 >/dev/null) > out
The escapes the line breaks. Without the
everything has to be written in one line.