Подтвердить что ты не робот

CURL: как отображать информацию о ходе во время загрузки?

Я использую следующий синтаксис для загрузки файлов:

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

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

4b9b3361

Ответ 1

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

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

который добавляет вывод команды в файл журнала, а также отсылает ее на stdout. Часть test ${PIPESTATUS[0]} -eq 0 делает это так, что статус выхода этой строки (который находится в bash script) - это тот же код выхода, что и команда 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.

Ответ 2

У меня возникли проблемы с перенаправлением принятой команды ответа и нашлось, что параметр -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

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

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