Làm thế nào để kiểm tra xem một lệnh như curl hoàn thành mà không có lỗi?


24

Tôi đang sử dụng curl để tải tệp lên máy chủ thông qua bài đăng HTTP.

curl -X POST -d@myfile.txt server-URL

Khi tôi thực hiện thủ công lệnh này trên dòng lệnh, tôi nhận được phản hồi từ máy chủ như thế nào "Upload successful". Tuy nhiên, làm thế nào nếu tôi muốn thực thi lệnh curl này thông qua một tập lệnh, làm thế nào tôi có thể tìm ra nếu yêu cầu POST của tôi thành công?

Câu trả lời:


21

Cách đơn giản nhất là lưu trữ phản hồi và so sánh nó:

$ response=$(curl -X POST -d@myfile.txt server-URL);
$ if [ "Upload successful" == "${response}" ]; then … fi;

Tôi đã không kiểm tra điều đó. Cú pháp có thể bị tắt, nhưng đó là ý tưởng. Tôi chắc chắn có nhiều cách tinh vi hơn để làm điều đó như kiểm tra mã thoát của curl hoặc một cái gì đó.

cập nhật

curltrả về khá nhiều mã thoát. Tôi đoán rằng một bài viết thất bại có thể dẫn đến 55 Failed sending network data.Vì vậy, bạn có thể chỉ cần đảm bảo mã thoát là 0 bằng cách so sánh với $?( Expands to the exit status of the most recently executed foreground pipeline.):

$ curl -X POST -d@myfile.txt server-URL;
$ if [ 0 -eq $? ]; then … fi;

Hoặc nếu lệnh của bạn tương đối ngắn và bạn muốn làm gì đó khi thất bại, bạn có thể dựa vào mã thoát như điều kiện trong câu lệnh có điều kiện:

$ if curl --fail -X POST -d@myfile.txt server-URL; then
    # …(success)
else
    # …(failure)
fi;

Tôi nghĩ định dạng này thường được ưa thích , nhưng cá nhân tôi thấy nó ít đọc hơn.


20

Bạn có thể sử dụng curl's --failtùy chọn, mặc dù vậy bạn nên kiểm tra nó một lần đầu tiên.

man curl

-f, --fail (HTTP) Lỗi âm thầm (không có đầu ra nào cả) do lỗi máy chủ. Điều này chủ yếu được thực hiện để kích hoạt tốt hơn các kịch bản vv để đối phó tốt hơn với các lần thử thất bại. Trong các trường hợp bình thường khi máy chủ HTTP không gửi được tài liệu, nó sẽ trả về một tài liệu HTML ghi rõ (thường cũng mô tả lý do tại sao và hơn thế nữa). Cờ này sẽ ngăn chặn cuộn tròn từ đầu ra đó và trả về lỗi 22.

          This method is not fail-safe and there are occasions where  non-
          successful  response  codes  will  slip through, especially when
          authentication is involved (response codes 401 and 407).

Theo cách này, bạn có thể làm:

args="-X POST -d@myfile.txt server-URL"
curl -f $args && echo "SUCCESS!" ||
    echo "OH NO!"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.