2017-01-05 5 views
2

Я бегу несколько команд с помощью &:как выводить только тогда, когда команда закончить

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 
+0

Похоже, есть некоторые детали, которые вы пропустили, чтобы объяснить: 1. Вы хотите буферировать stderr, а не stdout. 2. Выход Stderr должен быть записан в файл 'out'. Я отредактирую свой ответ ... – Socowi

ответ

3

Вы можете выполнить каждый curl внутри субоболочке:

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

2>&1 перенаправляет STDERR на стандартный вывод.
И да, вы можете иметь вложенные "" с командой подоболочек $() :)

Даунсайд: Это не может сохранить порядок выходов. Если второй curl заканчивается первым, он выводится первым.

Для того, чтобы сохранить выходы, вы можете использовать cat и <(). Bash's Замена процесса<(COMMAND) создает временный файл (фактически, это FIFO) из вывода COMMAND, но вам не нужно заботиться о имени, создании и удалении этого временного файла.

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

\ ускользает разрывы строк. Без \ все должно быть написано в одной строке.

+0

Привет, недостаток приемлем в моем случае использования ... спасибо! – Boyang