Я пытаюсь распечатать только подробные разделы запроса 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) Какой самый лучший способ подавить это?
Спасибо
-s
был ключ!-s
но без-v
вас вы не увидите ошибок, таких как сбой подключения. Для этого вы также должны добавить-S
(или--show-error
), как в ответе Mhoydis.curl
вjq
. Нет индикатора выполнения без перехода к трубопроводуjq
, тогда при переходе к конвейеруjq
я должен вернуться и добавить-s
.STDOUT
это не tty. Когда вывод не передается по конвейеру, вы не хотите, чтобы информация о прогрессе перемежалась с обычным выводом, который вы можете видеть и иметь некоторое представление о прогрессе. Когда вывод перенаправлен или передан по каналу, вы не можете его видеть, поэтому у вас нет индикатора прогресса - если только индикатор выполнения не включен.Это подавит диалог статуса, но в противном случае выведет ошибки в STDERR.
Выше выводится таблица состояния при перенаправлении.
Вышеуказанное подавляет таблицу состояния при перенаправлении, но ошибки все равно будут отправляться в STDERR.
Выше приведен пример ошибки для STDERR.
Просто добавьте 2> & 1 в конец, чтобы перенаправить STDERR в STDOUT (в данном случае, в файл).
источник
По словам
man curl
:Пример использования:
или если вы хотите захватить HTTP-тело в переменную в Bash
Вы можете использовать
-s
или--silent
взаимозаменяемо.источник
Что касается вопроса 1 ( откуда cURL знает, как отображать таблицу только при перенаправлении вывода), я не осознавал, что программа может сказать, что ее выходные данные были направлены, но, похоже, в системах POSIX есть функция,
isatty
которая сообщает, работает ли или нет дескриптор файла ссылается на терминал.источник
[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
со страницы man curl
curl должен использовать isatty для определения перенаправления и печатать индикатор выполнения при перенаправлении в файл или оболочку.
со страницы man curl
источник
Чтобы поместить реальные сообщения об ошибках где-то, вы должны записать strerr в файл журнала. Что-то вроде того:
источник
Находясь за прокси, я использую такую команду.
date -s "$ (curl --proxy http: // PROXY: 8080 -s http://google.com --head -s | grep Date | sed 's / Date: // g')"
источник