Bagaimana cara menyalurkan atau mengarahkan output curl -v?

117

Untuk beberapa alasan, output selalu dicetak ke terminal, terlepas dari apakah saya mengarahkannya melalui 2> atau> atau |. Apakah ada cara untuk menyiasatinya? Mengapa ini terjadi?

jonderry
sumber
3
Jika saya melakukannya curl -v url 2>&1, kesalahan diarahkan dengan benar ke output standar untuk saya.
Josh Lee

Jawaban:

134

tambahkan opsi -s(diam) untuk menghapus pengukur kemajuan, lalu alihkan stderr ke stdout untuk mendapatkan keluaran verbose pada fd yang sama dengan isi respons

curl -vs google.com 2>&1 | less
SingleNegationElimination
sumber
3
Ini berfungsi untuk sebagian besar situs web, tetapi untuk beberapa alasan server lokal di mesin saya masih mencetak keluaran penuh, bahkan jika saya melakukan `2> & 1 | grep asdfasdfasdfasdfdfs` atau sejenisnya. Output penuh termasuk header masih ditampilkan di konsol. Apakah ada aliran lain yang dapat saya salin ke grep untuk mengekstrak beberapa data yang saya perlukan?
jonderry
Informasi apa yang sebenarnya Anda coba ekstrak, dan informasi apa yang ingin Anda buang. Saya mengerti pertanyaan Anda berarti Anda ingin semua output dari -v diarahkan ke stdout.
SingleNegationElimination
Saya ingin memproses beberapa cookie (pada dasarnya grep beberapa info dari cookie dan lakukan beberapa hal lain). Ya, saya ingin semuanya berjalan lancar, jadi saya dapat memproses apa pun yang saya inginkan melalui pipa. Saat ini beberapa output hanya ditampilkan di konsol dan sepertinya tidak mungkin untuk dialihkan dan saya tidak yakin mengapa.
jonderry
Dapatkah Anda memposting tangkapan layar dari keluaran yang muncul di layar yang ingin Anda tangkap? Saya tidak tahu output seperti apa yang mungkin Anda lihat yang mungkin terlewatkan 2>&1.
SingleNegationElimination
Ini hanya jenis output yang sama dengan situs web lainnya. Satu-satunya perbedaan adalah server berjalan secara lokal. Adakah cara bagi program untuk mencetak ke konsol tetapi teks tersebut tidak ditangkap oleh stout / sterr?
jonderry
115

URL Anda mungkin memiliki ampersand di dalamnya. Saya mengalami masalah ini juga, dan saya menyadari bahwa URL saya penuh dengan ampersand (dari variabel CGI yang diteruskan) dan semuanya dikirim ke latar belakang dengan cara yang aneh dan dengan demikian tidak dialihkan dengan benar. Jika Anda memberi tanda kutip di sekitar URL, itu akan memperbaikinya.

jalan yang diambil
sumber
1
Saya memiliki masalah yang sama. Tidak perlu tombol 2> & 1 sehingga saya dapat memisahkan log output dan koneksi. Terima kasih roadnottaken.
quornian
3
Love Stack-O ... Saya menemukan q ini, dan penyebutan ampersand di URL. Itu menempatkan kutipan di sekitar saya, dan masalah terpecahkan.
Paulb
2
Kutipan itu berhasil bagi saya. Saya merasa seperti curl sedang dieksekusi di utas lain. Terima kasih banyak !
vdolez
1
Harus mencari di web selama lima menit sebelum Anda menyimpan malam saya :)
Shautieh
Astaga, betapa mengerikan serangga dalam ikal — setidaknya itu akan gagal atau memberi peringatan. Jawaban Anda di tahun 2012 membantu saya di tahun 2018. Saya butuh waktu 30 menit untuk menyelesaikan ini sampai saya menemukan jawaban Anda. Terima kasih!
Mauvis Ledford
29

Jawaban di atas tidak berhasil untuk saya, yang akhirnya berhasil adalah sintaks ini:

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

tee menempatkan output di layar, tetapi juga menambahkannya ke log saya.

Amir Mehler
sumber
1
&> /dev/stdoutjelas merupakan bagian yang hilang, terima kasih
mattspain
10

Jika Anda membutuhkan output dalam file, Anda dapat menggunakan redirect:

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

Harap pastikan untuk tidak membalik >curl-output.txtdan 2>&1, yang tidak akan berfungsi karena perilaku pengalihan bash .

panepeter
sumber
3

Saya menemukan hal yang sama: curl dengan sendirinya akan mencetak ke STDOUT, tetapi tidak dapat disalurkan ke program lain.

Pada awalnya, saya pikir saya telah menyelesaikannya dengan menggunakan xargs untuk menggemakan output terlebih dahulu:

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

Tapi kemudian, seperti yang ditunjukkan di komentar, ini juga berfungsi tanpa bagian xargs, jadi -s(mode diam) adalah kunci untuk mencegah keluaran kemajuan asing ke STDOUT:

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

Contoh di atas mengambil <sometag>konten sederhana (tidak mengandung tag yang disematkan) dari output XML dari pernyataan curl.

Brent Faust
sumber
2
dalam contoh Anda, 'xargs -0 echo |' tidak perlu. Selama Anda memiliki 'curl -s', Anda dapat menyalurkan output ke program lain.
Ryan Horrisberger
1

Hanya 2 sen saya. Perintah di bawah ini harus melakukan trik, seperti yang dijawab sebelumnya

curl -vs google.com 2>&1

Namun jika perlu mendapatkan keluaran ke file,

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

harus bekerja.

Thulasiram Gopalakrishna
sumber
1
Ini tidak menambah nilai nyata untuk jawaban yang diterima tahun 2011. Jika ada, ini bisa menjadi komentar untuk jawaban itu.
trincot
0

Yang berikut berhasil untuk saya:

Tempatkan pernyataan curl Anda dalam skrip bernama abc.sh

Sekarang jalankan:

sh abc.sh 1>stdout_output 2>stderr_output

Anda akan mendapatkan hasil curl stdout_outputdan info kemajuannya stderr_output.

amit
sumber
0

Contoh sederhana ini menunjukkan cara menangkap keluaran curl, dan menggunakannya dalam skrip bash

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 
Brad Parks
sumber