Làm thế nào để tôi dẫn hoặc chuyển hướng đầu ra của curl -v?


117

Vì một số lý do, đầu ra luôn được in đến thiết bị đầu cuối, bất kể tôi chuyển hướng nó qua 2> hay> hoặc |. Có cách nào để khắc phục điều này? Tại sao chuyện này đang xảy ra?


3
Nếu tôi làm curl -v url 2>&1, các lỗi được chuyển hướng chính xác đến đầu ra tiêu chuẩn cho tôi.
Josh Lee

Câu trả lời:


134

thêm -stùy chọn (im lặng) để xóa đồng hồ đo tiến độ, sau đó chuyển hướng stderr sang thiết bị xuất chuẩn để nhận đầu ra dài dòng trên cùng fd với thân phản hồi

curl -vs google.com 2>&1 | less

3
Điều này hoạt động với hầu hết các trang web, nhưng vì một số lý do, máy chủ cục bộ trên máy của tôi vẫn in toàn bộ đầu ra, ngay cả khi tôi làm `2> & 1 | grep asdfasdfasdfasdfdfs` hoặc một số thứ như vậy. Đầu ra đầy đủ bao gồm các tiêu đề vẫn được hiển thị trên bàn điều khiển. Có một số luồng khác mà tôi có thể chuyển vào grep để trích xuất một số dữ liệu mà tôi cần không?
jonderry

Thông tin nào bạn thực sự cố gắng trích xuất, và thông tin nào bạn muốn vứt đi. Tôi hiểu câu hỏi của bạn có nghĩa là bạn muốn tất cả đầu ra của -v hướng đến thiết bị xuất chuẩn.
SingleNegationElimination

Tôi muốn xử lý một số cookie (về cơ bản là grep một số thông tin từ cookie và làm một số thứ khác). Vâng, tôi muốn mọi thứ đi ra ngoài, vì vậy tôi có thể xử lý bất cứ điều gì tôi muốn thông qua các đường ống. Hiện tại một số đầu ra chỉ hiển thị trên bảng điều khiển và dường như không thể chuyển hướng và tôi không chắc tại sao.
jonderry

Bạn có thể đăng ảnh chụp màn hình của đầu ra xuất hiện trên màn hình mà bạn muốn chụp không? Tôi không biết loại đầu ra nào bạn có thể thấy mà có thể bị bỏ qua 2>&1.
Độc thân Khuyến khích

Nó chỉ là cùng một loại đầu ra như với bất kỳ trang web khác. Sự khác biệt duy nhất là máy chủ đang chạy cục bộ. Có cách nào để bất kỳ chương trình nào in ra bàn điều khiển nhưng văn bản đó không bị bắt bởi stout / sterr không?
jonderry

115

URL của bạn có thể có ký hiệu trong đó. Tôi cũng gặp vấn đề này và tôi nhận ra rằng URL của tôi chứa đầy ký hiệu (từ các biến CGI được thông qua) và vì vậy mọi thứ được gửi đến nền theo cách kỳ lạ và do đó không chuyển hướng đúng. Nếu bạn đặt dấu ngoặc kép xung quanh URL, nó sẽ sửa nó.


1
Tôi đã từng gặp vấn đề tương tự. Không cần 2> & 1 vì vậy tôi có thể tách riêng nhật ký đầu ra và kết nối. Cảm ơn roadnottaken.
quornian

3
Yêu Stack-O ... Tôi tìm thấy q này và đề cập đến ký hiệu trong URL. Nó đặt dấu ngoặc kép xung quanh tôi, và vấn đề được giải quyết.
Paulb

2
Các trích dẫn đã lừa tôi. Tôi cảm thấy như curl đang thực hiện trong các chủ đề khác. Cảm ơn rất nhiều !
vdolez

1
Phải tìm kiếm trên web trong năm phút trước khi bạn lưu buổi tối của tôi :)
Shautieh

Chúa ơi, thật là một lỗi khủng khiếp trong curl, ít nhất là nó sẽ thất bại hoặc đưa ra lời cảnh báo. Câu trả lời năm 2012 của bạn đã giúp tôi trong năm 2018. Mất 30 phút để giải quyết vấn đề này cho đến khi tôi bắt gặp câu trả lời của bạn. Cảm ơn bạn!
Mauvis Ledford

29

Câu trả lời ở trên không hiệu quả với tôi, cuối cùng thì cú pháp này là gì:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee đặt đầu ra trên màn hình, nhưng cũng gắn nó vào nhật ký của tôi.


1
&> /dev/stdoutchắc chắn là phần còn thiếu, cảm ơn
mattspain

10

Nếu bạn cần đầu ra trong một tệp, bạn có thể sử dụng chuyển hướng:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

Hãy chắc chắn không lật >curl-output.txt2>&1, nó sẽ không hoạt động do hành vi chuyển hướng của bash .


3

Tôi đã tìm thấy điều tương tự: chính nó sẽ in sang STDOUT, nhưng không thể chuyển sang chương trình khác.

Lúc đầu, tôi nghĩ rằng tôi đã giải quyết nó bằng cách sử dụng xargs để lặp lại đầu ra:

curl -s ... <url> | xargs -0 echo | ...

Nhưng sau đó, như đã chỉ ra trong các bình luận, nó cũng hoạt động mà không có phần xargs, vì vậy -s(chế độ im lặng) là chìa khóa để ngăn chặn đầu ra tiến trình không liên quan đến STDOUT:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

Ví dụ trên lấy <sometag>nội dung đơn giản (không chứa thẻ nhúng) từ đầu ra XML của câu lệnh curl.


2
trong ví dụ của bạn, 'xargs -0 echo |' là không cần thiết Miễn là bạn có 'curl -s', bạn có thể chuyển đầu ra sang chương trình khác.
Ryan Horrisberger

1

Chỉ cần 2 xu của tôi. Lệnh dưới đây nên thực hiện thủ thuật, như đã trả lời trước đó

curl -vs google.com 2>&1

Tuy nhiên nếu cần lấy đầu ra cho một tập tin,

curl -vs google.com > out.txt 2>&1

nên làm việc.


1
Điều này thêm không có giá trị thực sự cho câu trả lời được chấp nhận của năm 2011. Nếu bất cứ điều gì, đây có thể là một nhận xét cho câu trả lời đó.
trincot

0

Sau đây làm việc cho tôi:

Đặt câu lệnh curl của bạn trong một tập lệnh có tên abc.sh

Bây giờ chạy:

sh abc.sh 1>stdout_output 2>stderr_output

Bạn sẽ nhận được kết quả curl của bạn stdout_outputvà thông tin tiến trình trong stderr_output.


0

Ví dụ đơn giản này cho thấy cách nắm bắt đầu ra curl và sử dụng nó trong tập lệnh bash

kiểm tra

function main
{
  \curl -vs 'http://google.com'  2>&1
  # note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file. 
}

# capture output of curl to a variable
OUT=$(main)

# search output for something using grep.
echo
echo "$OUT" | grep 302 
echo
echo "$OUT" | grep title 
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.