cURL: как подавить странный вывод при перенаправлении?

Я пытаюсь распечатать только подробные разделы запроса 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) Какой самый лучший способ подавить это?

Спасибо

8 ответов

Решение

Попробуй это:

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

Это будет подавлять индикатор прогресса, отправить stdout в /dev/null и перенаправить stderr (-v вывод) в stdout,

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 (в данном случае, в файл).

В соответствии с 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 взаимозаменяемые.

Современные версиитеперь есть возможностькоторый отключает только индикатор прогресса, на который вы ссылаетесь.

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

1) Почему это проявляется только при определенных типах перенаправлений?

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

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

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

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

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

-s, - тихий

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

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

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

Находясь за прокси, я использую такую ​​команду.

date -s "$ (curl --proxy http://proxy:8080/ -s http://google.com/ --head -s |grep Date|sed 's/Date: //g')"

Другие вопросы по тегам