Curl -v'nin çıktısını nasıl yönlendiririm veya yönlendiririm?


117

Bazı nedenlerden ötürü, 2> veya> veya | ile yönlendirmeme bakılmaksızın, çıktı her zaman terminale yazdırılır. Bunu aşmanın bir yolu var mı? Bu neden oluyor?


3
Bunu yaparsam curl -v url 2>&1, hatalar benim için standart çıktıya doğru bir şekilde yeniden yönlendiriliyor.
Josh Lee

Yanıtlar:


134

-sİlerleme ölçeri kaldırmak için (sessiz) seçeneğini ekleyin , ardından yanıt gövdesiyle aynı fd'de ayrıntılı çıktı almak için stderr'i stdout'a yönlendirin

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

3
Bu çoğu web sitesi için çalışıyor, ancak nedense makinemdeki yerel sunucu, `2> & 1 | yapsam bile tam çıktıyı yazdırıyor. grep asdfasdfasdfasdfdfs` veya böyle bir şey. Başlıklar dahil tam çıktı hala konsolda görüntülenir. İhtiyacım olan bazı verileri çıkarmak için grep'e aktarabileceğim başka bir akış var mı?
jonderry

Gerçekte hangi bilgileri çıkarmaya çalışıyorsunuz ve hangi bilgileri atmak istiyorsunuz? Sorunuzun, -v'nin tüm çıktısının stdout'a yönlendirilmesini istediğiniz anlamına geldiğini anladım.
SingleNegationElimination

Tanımlama bilgilerinin bir kısmını işlemek istiyorum (temelde tanımlama bilgilerinden bazı bilgiler toplayın ve başka şeyler yapın). Evet, her şeyin standart hale gelmesini istiyorum, böylece istediğim her şeyi borularla işleyebilirim. Şu anda çıktının bir kısmı yalnızca konsolda görüntüleniyor ve yeniden yönlendirmek imkansız görünüyor ve nedenini bilmiyorum.
jonderry

Yakalamak istediğiniz ekranda görünen çıktının bir ekran görüntüsünü gönderebilir misiniz? Muhtemelen gözden kaçabilecek ne tür çıktılar görebileceğinizi bilmiyorum 2>&1.
SingleNegationElimination

Diğer herhangi bir web sitesiyle aynı çıktı türü. Tek fark, sunucunun yerel olarak çalışmasıdır. Herhangi bir programın konsola yazdırmasının ancak bu metnin stout / sterr tarafından yakalanmasının bir yolu var mı?
jonderry

115

URL'nizin içinde muhtemelen ve işaretleri vardır. Ben de bu problemi yaşadım ve URL'min ve işaretleriyle dolu olduğunu fark ettim (geçirilen CGI değişkenlerinden) ve bu nedenle her şey tuhaf bir şekilde arka plana gönderildi ve bu nedenle düzgün bir şekilde yeniden yönlendirilmiyordu. URL'yi tırnak içine alırsanız, onu düzeltir.


1
Ben de aynı sorunu yaşadım. 2> & 1'e gerek yok, böylece çıkışı ve bağlantı kaydını ayrı tutabilirim. Teşekkürler roadnottaken.
quornian

3
Yığını Seviyorum ... Bu q'yu ve URL'de "ve" işaretlerinin geçtiğini buldum. Benimkine alıntılar koydu ve problem çözüldü.
Paulb

2
Alıntılar benim için hile yaptı. Curl'nin başka iş parçacıklarında yürütüldüğünü hissettim. Çok teşekkürler !
vdolez


Tanrım, ne korkunç bir kıvrılma hatası - en azından başarısız olmalı ya da bir uyarı vermeli. 2012 cevabınız 2018'de bana yardımcı oldu. Cevabınızı bulana kadar bunu çözmek için 30 dakika sürdü. Teşekkür ederim!
Mauvis Ledford

29

Yukarıdaki cevap benim için işe yaramadı, sonunda şu sözdizimi oldu:

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

tee çıktıyı ekrana koyar ama aynı zamanda günlüğüme ekler.


1
&> /dev/stdoutkesinlikle eksik
kısımdı


3

Ben de aynı şeyi buldum: curl kendi başına STDOUT'a yazdırırdı, ancak başka bir programa aktarılamaz.

İlk başta, ilk olarak çıktıyı yankılamak için xargs kullanarak çözdüğümü düşündüm:

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

Ancak yorumlarda da belirtildiği gibi, xargs parçası olmadan da çalışır, bu nedenle -s(sessiz mod) STDOUT'a gereksiz ilerleme çıktısını önlemenin anahtarıdır:

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

Yukarıdaki örnek <sometag>, curl ifadesinin XML çıktısından basit içeriği (gömülü etiket içermeyen) alır.


2
örneklerinizde 'xargs -0 echo |' gereksizdir. 'Curl -s'ye sahip olduğunuz sürece, çıktıyı başka bir programa aktarabilirsiniz.
Ryan Horrisberger

1

Sadece 2 sentim. Aşağıdaki komut, daha önce cevaplandığı gibi hile yapmalıdır

curl -vs google.com 2>&1

Ancak çıktıyı bir dosyaya almanız gerekiyorsa,

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

çalışmalı.


1
Bu, 2011'in kabul edilen cevabına gerçek bir değer katmaz. Varsa, bu o cevaba bir yorum olabilir.
trincot

0

Aşağıdakiler benim için çalıştı:

Curl ifadenizi adlı bir komut dosyasına koyun abc.sh

Şimdi çalıştırın:

sh abc.sh 1>stdout_output 2>stderr_output

Curl'nizin sonuçlarını stdout_outputve ilerleme bilgilerini alacaksınız stderr_output.


0

Bu basit örnek, curl çıktısının nasıl yakalanacağını ve bir bash betiğinde nasıl kullanılacağını gösterir.

test.sh

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 
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.