Подтвердить что ты не робот

Создание curl посылает ошибки stderr и все остальное в stdout

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Попробуйте следующее:

# 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

Ответ 3

curl -s -S

На странице man:

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

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

Ответ 4

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