2012-04-02 2 views
22

я использую следующий синтаксис для загрузки файлов:cURL: как отображать информацию о ходе во время загрузки?

curl --form [email protected] --form press=OK [URL] 

Как отобразить прогресс? Спасибо.

+3

http://curl.haxx.se/docs/manpage.html См. Раздел о прогрессе. Я подозреваю, что вам нужно передать вывод в файл, хотя я не уверен. – Corbin

+0

Вы правы. Спасибо! – Determinant

ответ

44

Это то, что я использую в одном из моих скриптах сборки:

curl "${UPLOAD_URL}" \ 
    --progress-bar \ 
    --verbose \ 
    -F build="${BUILD}" \ 
    -F version="${VERSION}" \ 
    -F ipa="@${IPA};type=application/octet-stream" \ 
    -F assets="@-;type=text/xml" \ 
    -F replace="${REPLACE}" \ 
    -A "${CURL_FAKE_USER_AGENT}" \ 
    <<< "${ASSETS}" \ 
    | tee -a "${LOG_FILE}" ; test ${PIPESTATUS[0]} -eq 0 

-F и -A варианты, вероятно, не будет представлять интерес для вас, но полезные детали:

curl "${UPLOAD_URL}" --progress-bar 

который сообщает curl, чтобы показать индикатор выполнения (вместо индикатора выполнения по умолчанию) во время загрузки и:

| tee -a "${LOG_FILE}" ; test ${PIPESTATUS[0]} -eq 0 

, который добавляет вывод команды в файл журнала, а также echo - это stdout. Часть test ${PIPESTATUS[0]} -eq 0 делает это так, что статус выхода этой строки (который находится в сценарии bash) - это тот же код выхода, что и команда curl, а не статус выхода команды tee (необходимо, поскольку tee фактически является последней командой, являющейся выполненных в этой строке, а не curl).


От man curl:

PROGRESS METER 
     curl normally displays a progress meter during operations, indicating the amount of transferred data, transfer speeds and estimated time left, etc. 

     curl displays this data to the terminal by default, so if you invoke curl to do an operation and it is about to write data to the terminal, it disables the progress meter as otherwise it would mess up the 
     output mixing progress meter and response data. 

     If you want a progress meter for HTTP POST or PUT requests, you need to redirect the response output to a file, using shell redirect (>), -o [file] or similar. 

     It is not the same case for FTP upload as that operation does not spit out any response data to the terminal. 

     If you prefer a progress "bar" instead of the regular meter, -# is your friend. 

OPTIONS 
     -#, --progress-bar 
       Make curl display progress as a simple progress bar instead of the standard, more informational, meter. 
+1

NB! Команда 'tee', необходимая для получения информации о ходе загрузки. если вы не хотите использовать 'tee', тогда просто используйте команду' grep -v '^ uniqueStringNeverHappens $' '. Дополнительная информация: http://stackoverflow.com/a/17178410/751932 – Speakus

+1

Альтернативно: '>/dev/null' – asymmetric

+0

Это не работает для меня :( EDIT: неважно, проблема в том, что я хотел время, которое требуется, поэтому я использовал 'time curl --progress-bar --verbose ...', который препятствует отображению индикатора выполнения. Работает без работы. –

8

У меня была проблема с командой перенаправления принято отвечать и нашел -o вариант будет поместить выходной отклик в виде файла, который позволяет индикатор, чтобы показать.

curl --progress-bar \ 
    -o upload.txt \ 
    -H ${SOME_AUTH_HEADER} \ 
    -T ${SOME_LARGE_FILE} \ 
    "${UPLOAD_URL}" 

Просто еще один вариант получения желаемого результата.


ПРИМЕЧАНИЕ: Акцент на этой линии от страницы человека важно понять первопричину, почему индикатор не отображается, когда просто указав --progress-bar.

 If you want a progress meter for HTTP POST or PUT requests, 
     you need to redirect the response output to a file, 
     using shell redirect (>), -o [file] or similar. 
3

Все остальные ответы здесь имеют проблему, заключающуюся в том, что они требуют, чтобы вы записывали исходный вывод curl в файл (log). Однако это может не быть востребованным во всех случаях.

Проблема заключается в том, что завиток скрывает индикатор выполнения/метр, когда ожидается ответ сервера, который затем записывается в sdout. Так что в принципе можно перенаправить вывод в файл, чтобы снова отобразить панель. Однако мы не хотим этого, так /dev/null и tee может помочь нам здесь:

curl --progress-bar -T "${SOME_LARGE_FILE}" "${UPLOAD_URL}" | tee /dev/null 

выхода загнутого уголка передаются tee который записывает вывод как на консоль (которую мы хотим видеть прогресс бар, а также сервер ответ) и в файл (который нам не нужен, но поскольку мы используем /dev/null, это не имеет значения).

Обратите внимание, что разработчики curl, конечно же, не скрывали индикатор выполнения для удовольствия.В этом случае вы можете не всегда видеть результат сервера, или он может отображаться только несколько секунд, но если вас это не волнует, решение является хорошим.

Смежные вопросы