55

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

Спасибо

7 ответов7

52

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

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

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

18
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-тело в переменную в Bash

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

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

4

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

2

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

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

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

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

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

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

-s, - тихий

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

1

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .