cURL: làm thế nào để triệt tiêu đầu ra lạ khi chuyển hướng?


67

Tôi đang cố gắng chỉ in các phần dài dòng của yêu cầu cURL (được gửi đến stderr) từ bash shell.

Nhưng khi tôi chuyển hướng stdoutnhư thế này:

curl -v http://somehost/somepage > /dev/null

Một số loại bảng kết quả xuất hiện ở giữa đầu ra để stderr:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

Tiếp theo là gần cuối:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

Mà làm cho các tiêu đề phản ứng ít đọc hơn.

Tôi không thấy văn bản này khi không chuyển hướng.


Một cách khác để xem các hiệu ứng:

Bảng không xuất hiện:

curl -v http://somehost/somepage 2>&1

Bảng xuất hiện:

curl -v http://somehost/somepage 2>&1 | cat

1) Tại sao điều này chỉ xuất hiện với một số loại chuyển hướng nhất định?

2) Cách gọn gàng nhất để đàn áp nó là gì?

Cảm ơn bạn

Câu trả lời:


60

Thử đi:

curl -vs -o /dev/null http://somehost/somepage 2>&1

Điều đó sẽ triệt tiêu đồng hồ đo tiến độ, gửi stdoutđến /dev/nullvà chuyển hướng stderr( -vđầu ra) đến stdout.


32
Cảm ơn, -slà chìa khóa!
Ian Mackinnon

6
@IanMackinnon Lưu ý rằng có -snhưng không có -vbạn sẽ không thấy các lỗi như không kết nối được. Cho rằng bạn cũng nên thêm -S(hoặc --show-error) như trong câu trả lời của mhoydis.
Artyom

nhưng tại sao thanh tiến trình chỉ xuất hiện ở vị trí đầu tiên khi chuyển hướng? Tôi chạy vào vấn đề này tương tự khi đường ống đầu ra của curlđể jq. Không có thanh tiến trình mà không có đường ống đến jq, sau đó khi đường ống đến jqtôi phải quay lại và thêm -s.
Sixty4bit

@ sixty4bit: Đó là một lựa chọn thiết kế mà các nhà phát triển đã thực hiện. Chương trình có thể phát hiện khi nó STDOUTkhông phải là một tty. Khi đầu ra không được xử lý, bạn không muốn thông tin tiến trình được xen kẽ với đầu ra bình thường, bạn có thể thấy và có một số ý tưởng về tiến trình. Khi đầu ra được chuyển hướng hoặc đường ống, bạn không thể nhìn thấy nó để bạn không có thước đo tiến trình - trừ khi thanh tiến trình được bật.
Dennis Williamson

23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Điều này sẽ ngăn chặn hộp thoại trạng thái, nhưng nếu không sẽ xuất lỗi thành STDERR.

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

Ở trên xuất ra bảng trạng thái khi chuyển hướng.

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

Ở trên ngăn chặn bảng trạng thái khi chuyển hướng, nhưng lỗi vẫn sẽ đến STDERR.

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

Trên đây là một ví dụ về lỗi đối với STDERR.

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

Chỉ cần thêm 2> & 1 vào cuối để chuyển hướng STDERR sang STDOUT (trong trường hợp này là vào một tệp).


5

Theo man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

Ví dụ sử dụng:

curl -s 'http://www.google.com'

hoặc nếu bạn muốn bắt HTTP-BODY thành một biến trong bash

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

Bạn có thể sử dụng -shoặc --silenthoán đổi cho nhau.


4

Với tham chiếu đến câu hỏi 1 ( làm thế nào cURL biết chỉ hiển thị bảng khi đầu ra được chuyển hướng), tôi không nhận ra một chương trình có thể cho biết các đầu ra của nó đang được định hướng, nhưng dường như trên các hệ thống POSIX có chức năng isattybáo cáo có hay không một mô tả tập tin đề cập đến một thiết bị đầu cuối.


2
Đây là đoạn trích Bash:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson

2

1) Tại sao điều này chỉ xuất hiện với một số loại chuyển hướng nhất định?

từ trang người đàn ông

Nếu bạn muốn một máy đo tiến độ cho các yêu cầu HTTP POST hoặc PUT, bạn cần chuyển hướng đầu ra phản hồi đến một tệp, sử dụng chuyển hướng shell (>), -o [file] hoặc tương tự.

curl phải sử dụng isatty để xác định chuyển hướng và in đồng hồ đo tiến độ khi được chuyển hướng đến một tập tin hoặc ống vỏ.

2) Cách gọn gàng nhất để đàn áp nó là gì?

từ trang người đàn ông

-s, -

Chế độ im lặng hoặc yên tĩnh. Không hiển thị đồng hồ đo tiến độ hoặc thông báo lỗi. Làm cho Curl câm. Nó vẫn sẽ xuất dữ liệu bạn yêu cầu, thậm chí có khả năng đến thiết bị đầu cuối / thiết bị xuất chuẩn trừ khi bạn chuyển hướng nó.


1

Để đặt thông báo lỗi thực sự ở bất cứ đâu, bạn nên viết strerr vào một tệp nhật ký. Một cái gì đó như thế:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

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.