2012-04-02 21 views
22

tôi sử dụng cú pháp sau để tải lên tập tin:cURL: Cách hiển thị thông tin tiến trình trong khi tải lên?

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

Làm thế nào để hiển thị sự tiến bộ? Cám ơn.

+3

http://curl.haxx.se/docs/manpage.html Xem phần trên đồng hồ đo tiến độ. Tôi nghi ngờ rằng bạn cần phải đầu ra đường ống vào một tập tin, mặc dù không phải là tích cực. – Corbin

+0

Bạn nói đúng. Cám ơn! – Determinant

Trả lời

44

Đây là những gì tôi sử dụng trong một hợp đồng xây dựng các kịch bản của tôi:

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 

Các -F-A tùy chọn có thể sẽ không được quan tâm đến bạn, nhưng những phần hữu ích là:

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

cho biết curl để hiển thị thanh tiến trình (thay vì 'đồng hồ đo tiến độ' mặc định) trong khi tải lên và:

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

nối thêm đầu ra của lệnh vào tệp nhật ký và cũng có thể làm lại nó tới stdout. Phần test ${PIPESTATUS[0]} -eq 0 làm cho nó để trạng thái thoát của dòng này (trong tập lệnh bash) là cùng một mã thoát mà lệnh curl trả lại và không phải là trạng thái thoát của lệnh tee (cần thiết vì tee thực sự là lệnh cuối cùng được thực hiện trong dòng này, không phải curl).


Từ 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' lệnh cần thiết để có được thông tin về tiến trình tải xuống. nếu bạn không muốn sử dụng 'tee' thì chỉ cần sử dụng lệnh' grep -v '^ uniqueStringNeverHappens $' '. thêm thông tin: http://stackoverflow.com/a/17178410/751932 – Speakus

+1

Cách khác: '>/dev/null' – asymmetric

+0

Điều này dường như không hoạt động đối với tôi: ( EDIT: nevermind, vấn đề là tôi muốn thời gian phải mất bao lâu, vì vậy tôi đã sử dụng 'time curl --progress-bar --verbose ...' để ngăn không cho thanh tiến trình hiển thị. –

8

tôi đã gặp rắc rối với chuyển hướng lệnh câu trả lời chấp nhận và tìm thấy các tùy chọn -o sẽ đặt ra câu trả lời trong một tập tin cho phép thanh tiến trình để hiển thị.

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

Chỉ một tùy chọn khác để có được kết quả mong muốn.


LƯU Ý: Nhấn mạnh vào dòng này từ trang con người là quan trọng để hiểu được nguyên nhân gốc rễ của lý do tại sao các thanh tiến trình không hiển thị khi chỉ định --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

Tất cả câu trả lời khác ở đây đều có vấn đề mà chúng yêu cầu bạn viết đầu ra gốc của tập tin curl vào tệp nhật ký. Tuy nhiên, điều này có thể không được mong muốn trong mọi trường hợp.

Vấn đề là curl ẩn thanh tiến trình/mét, khi phản hồi của máy chủ được mong đợi, sau đó được ghi vào sdout. Vì vậy, về cơ bản có thể chuyển hướng đầu ra đến một tập tin để hiển thị lại thanh. Tuy nhiên chúng tôi không muốn điều đó, vì vậy /dev/nulltee có thể giúp chúng tôi ở đây:

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

đầu ra Curl được truyền cho tee mà viết đầu ra cả ra cửa sổ Console (mà chúng tôi muốn nhìn thấy thanh tiến trình và cũng là máy chủ phản hồi) và vào một tập tin (mà không cần thiết bởi chúng tôi, nhưng khi chúng tôi sử dụng /dev/null điều này không quan trọng).

Lưu ý rằng các nhà phát triển curl tất nhiên không ẩn thanh tiến trình để giải trí.Trong trường hợp này ở đây bạn có thể không phải lúc nào cũng nhìn thấy kết quả máy chủ hoặc nó chỉ có thể được hiển thị một vài giây, nhưng nếu bạn không quan tâm về điều này, thì giải pháp là một giải pháp tốt.

Các vấn đề liên quan