2012-04-02 25 views

Respuesta

44

Esto es lo que yo uso en una de mis scripts de construcción:

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 

El -F y -A opciones probablemente no será de interés para usted, pero las partes útiles son:

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

que indica curl para mostrar una barra de progreso (en lugar del "contador de progreso" predeterminado) durante la carga, y:

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

que agrega la salida del comando a un archivo de registro y también lo hace eco al stdout. La parte test ${PIPESTATUS[0]} -eq 0 lo hace para que el estado de salida de esta línea (que está en un script bash) sea el mismo código de salida que el curl y no el estado de salida del comando tee (necesario porque tee es realmente el último comando ejecutado en esta línea, no curl).


De 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! comando 'tee' requerido para obtener información sobre el progreso de la descarga. si no desea usar 'tee', simplemente use el comando' grep -v '^ uniqueStringNeverHappens $' '. más información: http://stackoverflow.com/a/17178410/751932 – Speakus

+1

Alternativamente: '>/dev/null' – asymmetric

+0

Esto no parece funcionar para mí :( EDITAR: no importa, el problema era que yo quería tiempo cuánto tiempo lleva, así que usé 'time curl --progress-bar --verbose ...' que impide que se muestre la barra de progreso. Funcionar sin tiempo funciona. –

8

que tenían problemas con la redirección de comandos de la respuesta aceptada y se encontró la opción -o colocará la salida de respuesta en un archivo que permite que la barra de progreso en aparecer.

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

Simplemente otra opción para obtener el resultado deseado.


NOTA: Énfasis en esta línea de la página man es importante entender la causa de por qué la barra de progreso no se muestra cuando se acaba de especificar --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

Todas las demás respuestas aquí tienen el problema de que requieren que escriba la salida original de curl en un archivo (registro). Sin embargo, esto no puede ser deseado en todos los casos.

El problema es que curl oculta la barra de progreso/metro, cuando se espera una respuesta del servidor, que luego se escribe en sdout. Así que, básicamente, puede redirigir la salida a un archivo para mostrar la barra de nuevo. Sin embargo no queremos que, por lo /dev/null y tee nos puede ayudar aquí:

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

salida de rizo se pasa a tee el que escribe la salida tanto a la consola (que queremos ver la barra de progreso y el servidor respuesta) y en un archivo (que no es necesario para nosotros, pero como usamos /dev/null esto no importa).

Tenga en cuenta que los desarrolladores de curl por supuesto no ocultaron la barra de progreso por diversión.En este caso, es posible que no siempre vea el resultado del servidor o que solo se muestre durante unos segundos, pero si no le importa esto, la solución es buena.

Cuestiones relacionadas