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был ключ!
Ян Маккиннон
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 (в данном случае, в файл).

mhoydis
источник
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-тело в переменную в Bash

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

Вы можете использовать -sили --silentвзаимозаменяемо.

Венкат Гусан
источник
4

Что касается вопроса 1 ( откуда cURL знает, как отображать таблицу только при перенаправлении вывода), я не осознавал, что программа может сказать, что ее выходные данные были направлены, но, похоже, в системах POSIX есть функция, isattyкоторая сообщает, работает ли или нет дескриптор файла ссылается на терминал.

Ян Маккиннон
источник
2
Вот фрагмент кода Bash:[[ -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) Почему это проявляется только при определенных типах перенаправлений?

со страницы man curl

Если вам нужен индикатор выполнения запросов HTTP POST или PUT, вам нужно перенаправить вывод ответа в файл, используя shell redirect (>), -o [file] или аналогичный.

curl должен использовать isatty для определения перенаправления и печатать индикатор выполнения при перенаправлении в файл или оболочку.

2) Какой самый лучший способ подавить это?

со страницы man curl

-s, - тихий

Тихий или тихий режим. Не показывать индикатор прогресса или сообщения об ошибках. Делает Curl немым. Он по-прежнему будет выводить запрашиваемые вами данные, потенциально даже в терминал / стандартный вывод, если вы не перенаправите их.

Wyrmwood
источник
1

Чтобы поместить реальные сообщения об ошибках где-то, вы должны записать strerr в файл журнала. Что-то вроде того:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
user1065951
источник