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')"