CURL: bagaimana cara menekan output aneh ketika mengarahkan?

67

Saya mencoba untuk mencetak hanya bagian verbose dari permintaan CURL (yang dikirim ke stderr) dari bash shell.

Tetapi ketika saya mengarahkan stdoutseperti ini:

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

Beberapa jenis tabel hasil muncul di tengah output ke 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

Diikuti oleh ini menjelang akhir:

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

Yang membuat header respons lebih mudah dibaca.

Saya tidak melihat teks ini ketika tidak mengarahkan.


Cara lain untuk melihat efeknya:

Tabel tidak muncul:

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

Tabel muncul:

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

1) Kenapa ini muncul hanya dengan jenis pengalihan tertentu?

2) Apa cara paling rapi untuk menekannya?

Terima kasih

Ian Mackinnon
sumber

Jawaban:

60

Coba ini:

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

Itu akan menekan meter kemajuan, kirim stdoutke /dev/nulldan redirect stderr( -voutput) ke stdout.

Dennis Williamson
sumber
32
Terima kasih, -skuncinya!
Ian Mackinnon
6
@IanMackinnon Perhatikan bahwa dengan -stetapi tanpa -vAnda tidak akan melihat kesalahan seperti kegagalan untuk terhubung. Untuk itu Anda juga harus menambahkan -S(atau --show-error) seperti pada jawaban mhoydis.
Artyom
tetapi mengapa bilah kemajuan hanya muncul di tempat pertama saat mengarahkan? Saya mengalami masalah yang sama ketika menyalurkan output curlke jq. Tidak ada progress bar tanpa piping jq, maka ketika piping ke jqsaya harus kembali dan menambahkan -s.
sixty4bit
@ sixty4bit: Itu pilihan desain yang dibuat pengembang. Program ini dapat mendeteksi ketika STDOUTitu bukan tty. Ketika output tidak sedang disalurkan, Anda tidak ingin informasi kemajuan diselingi dengan output normal, yang dapat Anda lihat dan memiliki beberapa gagasan tentang kemajuan. Ketika output diarahkan atau disalurkan, Anda tidak dapat melihatnya sehingga Anda tidak memiliki pengukur untuk kemajuan - kecuali bilah kemajuan dihidupkan.
Dennis Williamson
23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Ini akan menekan dialog status, tetapi sebaliknya akan menghasilkan kesalahan ke STDERR.

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

Di atas menampilkan tabel status saat mengarahkan.

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

Di atas menekan tabel status ketika mengarahkan ulang, tetapi kesalahan masih akan pergi ke STDERR.

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

Di atas adalah contoh kesalahan untuk STDERR.

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'

Cukup tambahkan 2> & 1 di akhir untuk mengarahkan STDERR ke STDOUT (dalam hal ini, ke file).

mhoydis
sumber
5

Menurut man curl:

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

Contoh penggunaan:

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

atau jika Anda ingin menangkap HTTP-BODY menjadi variabel di bash

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

Anda dapat menggunakan -satau --silentsecara bergantian.

Venkatt Guhesan
sumber
4

Dengan mengacu pada pertanyaan 1 ( bagaimana CURL tahu hanya menampilkan tabel ketika output dialihkan), saya tidak menyadari suatu program dapat mengatakan bahwa outputnya diarahkan, tetapi tampaknya pada sistem POSIX ada fungsi isattyyang melaporkan apakah atau tidak deskriptor file merujuk ke terminal.

Ian Mackinnon
sumber
2
Ini cuplikan Bash:[[ -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) Kenapa ini muncul hanya dengan jenis pengalihan tertentu?

dari halaman manual curl

Jika Anda menginginkan pengukur kemajuan untuk permintaan HTTP POST atau PUT, Anda perlu mengalihkan output respons ke file, menggunakan shell redirect (>), -o [file] atau serupa.

curl harus menggunakan isatty untuk menentukan pengalihan dan mencetak pengukur kemajuan ketika diarahkan ke file atau pipa shell.

2) Apa cara paling rapi untuk menekannya?

dari halaman manual curl

-s, --silent

Mode diam atau sunyi. Jangan tampilkan pengukur kemajuan atau pesan kesalahan. Membuat Curl bisu. Itu masih akan menampilkan data yang Anda minta, bahkan berpotensi ke terminal / stdout kecuali Anda mengarahkannya.

Wyrmwood
sumber
1

Untuk meletakkan pesan kesalahan nyata di suatu tempat, Anda harus menulis strerr ke file log. Sesuatu seperti itu:

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