2012-04-02 12 views

risposta

44

Questo è quello che uso in uno dei miei script di build:

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 

Il -F e -A opzioni probabilmente non saranno di vostro interesse, ma le parti utili sono:

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

che indica a curl di mostrare una barra di avanzamento (anziché il "misuratore di avanzamento" predefinito durante il caricamento, e:

che accoda l'output del comando a un file di registro e anche echo a stdout. La parte test ${PIPESTATUS[0]} -eq 0 fa in modo che lo stato di uscita di questa riga (che è in uno script bash) sia lo stesso codice di uscita restituito dal comando curl e non lo stato di uscita del comando tee (necessario perché tee è in realtà l'ultimo comando eseguito in questa riga, non curl).


Da 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' necessario per ottenere informazioni sullo stato del download. se non vuoi usare 'tee', usa il comando' grep -v '^ uniqueStringNeverHappens $' '. ulteriori informazioni: http://stackoverflow.com/a/17178410/751932 – Speakus

+1

In alternativa: '>/dev/null' – asymmetric

+0

Questo non sembra funzionare per me :( EDIT: non importa, il problema era che volevo tempo quanto tempo ci vuole, quindi ho usato 'time curl --progress-bar --verbose ...' che impedisce la visualizzazione della barra di avanzamento. –

8

Ho avuto problemi con il reindirizzamento comando del risposta accettata e hanno trovato l'opzione -o metterà l'uscita di risposta in un file che permette la barra di avanzamento di presentarsi.

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

Solo un'altra opzione per ottenere il risultato desiderato.


NOTA: L'enfasi su questa linea dalla pagina man è importante capire la causa principale del perché la barra di avanzamento non viene visualizzata quando appena specificando --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

Tutti gli altri risposta qui hanno il problema che essi richiedono di scrivere l'output originale del ricciolo in un file (log). Questo potrebbe tuttavia non essere richiesto in tutti i casi.

Il problema è che l'arricciatura nasconde la barra di avanzamento/metro, quando è attesa una risposta del server, che viene quindi scritta in sdout. Quindi, in pratica, è possibile reindirizzare l'output su un file per mostrare nuovamente la barra. Tuttavia non vogliamo che, così /dev/null e tee noi possiamo aiutare qui:

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

uscita di Curl è passato al tee che scrive l'output sia alla console (che vogliamo vedere la barra di avanzamento e anche il server risposta) e in un file (che non è necessario da noi, ma poiché si utilizza /dev/null ciò non ha importanza).

Nota che gli sviluppatori di arricciature non hanno nascosto la barra di avanzamento per divertimento.In questo caso qui potresti non vedere sempre il risultato del server o solo qualche secondo, ma se non ti interessa, la soluzione è buona.

Problemi correlati