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?
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
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.
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.
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:
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
curl -v url 2>&1
, kesalahan diarahkan dengan benar ke output standar untuk saya.Jawaban:
tambahkan opsi
-s
(diam) untuk menghapus pengukur kemajuan, lalu alihkan stderr ke stdout untuk mendapatkan keluaran verbose pada fd yang sama dengan isi responssumber
2>&1
.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.
sumber
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.
sumber
&> /dev/stdout
jelas merupakan bagian yang hilang, terima kasihJika Anda membutuhkan output dalam file, Anda dapat menggunakan redirect:
Harap pastikan untuk tidak membalik
>curl-output.txt
dan2>&1
, yang tidak akan berfungsi karena perilaku pengalihan bash .sumber
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:
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:Contoh di atas mengambil
<sometag>
konten sederhana (tidak mengandung tag yang disematkan) dari output XML dari pernyataan curl.sumber
Hanya 2 sen saya. Perintah di bawah ini harus melakukan trik, seperti yang dijawab sebelumnya
Namun jika perlu mendapatkan keluaran ke file,
harus bekerja.
sumber
Yang berikut berhasil untuk saya:
Tempatkan pernyataan curl Anda dalam skrip bernama
abc.sh
Sekarang jalankan:
Anda akan mendapatkan hasil curl
stdout_output
dan info kemajuannyastderr_output
.sumber
Contoh sederhana ini menunjukkan cara menangkap keluaran curl, dan menggunakannya dalam skrip bash
test.sh
sumber