cURL: yönlendirilirken garip çıktı nasıl bastırılır?


67

Sadece bir cURL isteğinin ayrıntılı bölümlerini stderrbash kabuğundan göndermeye çalışıyorum.

Ama stdoutböyle yönlendirdiğimde :

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

Çıktının ortasında bir tür sonuç tablosu görünür 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

Bunu sonuna kadar izledi:

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

Bu, yanıt başlıklarını daha az okunabilir hale getirir.

Yönlendirme olmadığında bu metni göremiyorum.


Etkileri görmenin başka bir yolu:

Tablo görünmüyor:

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

Tablo görünür:

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

1) Bu nasıl belli yönlendirmelerle ortaya çıkıyor?

2) Onu bastırmanın en zarif yolu nedir?

teşekkür ederim

Yanıtlar:


60

Bunu dene:

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

Yani, ilerleme göstergesi bastırmak gönderecek stdoutiçin /dev/nullve yönlendirme stderr( -vçıktı) stdout.


32
Teşekkürler, -sanahtar oldu!
Ian Mackinnon

6
@IanMackinnon Dikkat edin, -sancak -vsiz olmadan bağlanmak gibi hatalar görmeyeceksiniz. Bunun için ayrıca mhoydis'in cevabındaki gibi eklemelisiniz -S(veya --show-error).
Artyom

Ancak , ilerleme çubuğu neden yeniden yönlendirirken yalnızca ilk sırada görünüyor? Çıktısının zaman aynı sorun koştum curliçin jq. Borusuz ilerleme çubuğu yok jq, daha sonra borucum jqgeri dönüp eklemek zorundayım -s.
sixty4bit

@ sixty4bit: Geliştiricilerin yaptığı bir tasarım seçimi. Program ne zaman STDOUTtty olmadığını algılayabilir . Çıkış boruya alınmadığında, ilerleme bilgilerinin görebileceğiniz ve ilerleme hakkında bir fikriniz olan normal çıkışla serpiştirilmesini istemezsiniz. Çıktı yeniden yönlendirildiğinde ya da yayınlandığında, onu göremezsiniz, bu sayede ilerleme için bir ölçere sahip olmazsınız - ilerleme çubuğu açık değilse.
Dennis Williamson,

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

Bu durum iletişim kutusunu bastırır, ancak aksi takdirde STDERR'ye hataları verir.

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

Yukarıdakiler, yeniden yönlendirme yaparken durum tablosunu çıkarır.

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

Yukarıdakiler, yeniden yönlendirme yaparken durum tablosunu gizler, ancak hatalar yine de STDERR'ye gider.

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

Yukarıdaki, STDERR'ye bir hata örneğidir.

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'

STDERR'yi STDOUT'a (bu durumda, bir dosyaya) yönlendirmek için sonuna 2> & 1 ekleyin.


5

Göre man curl:

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

Örnek kullanım:

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

ya da HTTP-BODY'yi bash içindeki bir değişkene yakalamak istiyorsanız

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

Kullanabilir -sveya --silentdeğiştirilebilir.


4

Soru 1'e atıfta bulunarak ( cURL yalnızca çıkış yeniden yönlendirildiğinde tabloyu nasıl görüntüleyeceğini bilir), bir programın çıkışlarının yönlendirildiğini söyleyebileceğini anlamadım, ancak POSIX sistemlerinde isattygörünüp görünmeyeceğini bildiren bir işlev varmış gibi görünüyor bir dosya tanıtıcısı bir terminale atıfta bulunur.


2
İşte bir Bash pasajı:[[ -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) Bu nasıl belli yönlendirmelerle ortaya çıkıyor?

curl man sayfasından

HTTP POST veya PUT istekleri için bir ilerleme ölçer istiyorsanız, kabuk çıktısını (>), -o [dosya] veya benzerini kullanarak yanıt çıktısını bir dosyaya yönlendirmeniz gerekir.

curl , yönlendirmeyi belirlemek için isatty kullanmalı ve bir dosya veya kabuk borusuna yönlendirildiğinde ilerleme sayacını yazdırmalıdır.

2) Onu bastırmanın en zarif yolu nedir?

curl man sayfasından

-s, --sessiz

Sessiz veya sessiz mod. İlerleme ölçer veya hata mesajlarını gösterme. Kıvrılmayı susturur. Yönlendirmediğiniz sürece, hala potansiyel olarak terminal / stdout'a istediğiniz verileri çıkartacaktır.


1

Bir yerde gerçek hata mesajları koymak için, bir günlük dosyasına strerr yazmalısınız. Bunun gibi bir şey:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.