Выполнение curl отправляет ошибки в stderr и все остальное в stdout - PullRequest
24 голосов
/ 04 августа 2011

Есть ли способ сообщить curl об ошибках вывода в stderr, а все остальное - в stdout?

Причина в том, что я использую curl из командной строки (фактически cronjob) для загрузки файла вFTP-сайт каждый вечер.К сожалению, из-за того, что curl выводит информацию о состоянии на stderr, я получаю электронное письмо об ошибке, когда ничего не происходит.(Я перенаправляю stdout в файл журнала, но оставляю stderr без изменений, так что cron отправит его мне по электронной почте, если будет какой-либо вывод.)

Существуют варианты, чтобы curl молчал или выводил все наstdout, однако обе эти альтернативы предотвращают появление ошибок на stderr - это означает, что я не получу электронное письмо, когда на самом деле возникнет ошибка, о которой я хочу знать.

Так что есть способ сделать только curlошибки вывода на stderr, но оставить нормальный вывод без изменений на stdout?

Ответы [ 4 ]

27 голосов
/ 17 августа 2013

Попробуйте:

# No error messages because it succeeds.
curl  http://www.shikadi.net/        --fail --silent --show-error

# This prints an error message to stderr
curl  http://i.like.you.def.maybe/   --fail --silent --show-error

Благодаря ответу Рассела Дэвиса на этой странице, man curl, а также методом проб и ошибок.Для любопытных, вот wget версия вопроса: https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages

6 голосов
/ 21 декабря 2016

curl -s -S

со страницы руководства:

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

-S При использовании с -s, в случае сбоя, curl показывает сообщение об ошибке.

3 голосов
/ 04 августа 2011

После еще нескольких экспериментов я нашел следующий обходной путь, но я все еще открыт для лучших альтернатив.

Он работает, временно сохраняя весь вывод (stdout и stderr) во временном файле, а затем отправляя содержимое этого файла в stderr или stdout в зависимости от кода выхода curl. Если curl не удалось, весь вывод будет отправлен в stderr (и будет отправлен мне по электронной почте благодаря cron), но если curl завершился успешно, вывод вместо этого перейдет в stdout (который перенаправляется в файл журнала в команде cron, в результате адрес электронной почты.)

# Get a temporary filename
CURL_LOG=`tempfile`

(
  # Run curl, and stick all output in the temp file
  /usr/bin/curl --verbose ... > "$CURL_LOG" 2>&1
) || (
  # If curl exited with a non-zero error code, send its output to stderr so that
  # cron will e-mail it.
  cat "$CURL_LOG" > /dev/stderr
  rm "$CURL_LOG"
  exit 1
)

# Otherwise curl completed successfully, so send the output to stdout (which
# is redirected to a log file in crontab)
cat "$CURL_LOG"
rm "$CURL_LOG"
1 голос
/ 17 января 2013

curl -f. В документации написано «Сбой в работе (без вывода) при ошибках сервера», но на самом деле это означает «без вывода на стандартный вывод» - ошибки все равно будут выводиться на stderr.

...