CURL: як придушити дивний вихід при переадресації?


67

Я намагаюся надрукувати лише багатослівні розділи запиту CURL (які надсилаються stderr) з оболонки bash.

Але коли я переадресовую stdoutтак:

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

У середині виводу з’являється якась таблиця результатів 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

Слідом за цим наприкінці:

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

Що робить заголовки відповідей менш читабельними.

Я не бачу цього тексту, коли не переспрямовується.


Ще один спосіб побачити ефекти:

Таблиця не відображається:

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

З'являється таблиця:

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

1) Як це відображається лише з певними типами переадресацій?

2) Який найновіший спосіб придушити це?

Дякую

Відповіді:


60

Спробуйте це:

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

Це буде придушувати індикатор прогресу, відправити stdoutдо /dev/nullі перенаправити stderr(на -vвихід) , щоб stdout.


32
Дякую, -sбуло ключовим!
Ian Mackinnon

6
@IanMackinnon Зауважте, що з, -sале без -vвас, ви не побачите помилок, таких як невдале підключення. Для цього слід також додати -S(або --show-error), як у відповіді mhoydis.
Артем

але чому панель прогресу відображається в першу чергу лише під час перенаправлення? Я зіткнувся з цим самим питанням, коли підключив вихід curlдо jq. Немає смужки прогресу без підключення до каналу jq, тоді при jqпереході до мене я повинен повернутися назад і додати -s.
шістдесят біт

@ sixty4bit: Це вибір дизайну, який зробили розробники. Програма може виявити, коли STDOUTце не tty. Якщо вихідний сигнал не проводиться, ви не хочете, щоб інформація про хід змішувалася з нормальним результатом, який ви можете бачити і мати певне уявлення про прогрес. Коли висновок буде переспрямовано або прокладено, ви не бачите його, щоб у вас не було датчика прогресу - якщо тільки не включена смужка прогресу.
Денніс Вільямсон

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

Це придушить діалог стану, але в іншому випадку виведе помилки в 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

Вищезазначене виводить таблицю стану при перенаправлення.

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

Вищенаведене пригнічує таблицю стану при переадресації, але помилки все одно перейдуть до STDERR.

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

Наведене вище є прикладом помилки 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'

Просто додайте 2> & 1 в кінці, щоб перенаправити STDERR на STDOUT (в даному випадку на файл).


5

Відповідно до man curl:

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

Приклад використання:

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

або якщо ви хочете захопити HTTP-BODY в змінну в bash

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

Ви можете використовувати -sабо --silentвзаємозамінно.


4

Посилаючись на питання 1 ( як CURL знає відображати таблицю лише тоді, коли вихід перенаправлений), я не розумів, що програма може сказати, що її результати спрямовуються, але, здається, в системах POSIX існує функція, isattyяка повідомляє, чи ні дескриптор файлу посилається на термінал.


2
Ось фрагмент Баша:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Денніс Вільямсон

2

1) Як це відображається лише з певними типами переадресацій?

зі сторінки чоловіка curl

Якщо ви хочете вимірювач прогресу для HTTP POST або PUT запитів, вам потрібно перенаправити відповідь на файл, використовуючи переадресацію оболонки (>), -o [файл] або подібне.

curl повинен використовувати isatty для визначення переспрямування та друкує метр прогресу при перенаправлення на файл або оболонку.

2) Який найновіший спосіб придушити це?

зі сторінки чоловіка curl

-s, --silent

Безшумний або тихий режим. Не показувати вимірювач прогресу або повідомлення про помилки Робить Curl приглушеним. Він все одно виводить запитувані вами дані, можливо навіть до терміналу / stdout, якщо ви не перенаправите їх.


1

Щоб десь помістити справжні повідомлення про помилки, слід записати strerr у файл журналу. Щось таке:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.