web-dev-qa-db-ja.com

curlがエラーをstderrに送信し、その他すべてをstdoutに送信させる

エラーをstderrに出力し、その他すべてをstdoutに出力するようにcurlに指示する方法はありますか?

その理由は、コマンドライン(実際にはcronjob)からcurlを使用して、毎晩FTPサイトにファイルをアップロードしているためです。残念ながら、curlはstderrにステータス情報を出力するため、実際には何も問題がなかったときにエラーに関する電子メールを受信します。 (私はstdoutをログファイルにリダイレクトしていますが、出力がある場合はcronから電子メールで送信されるように、stderrは変更しません。)

Curlをサイレントにするか、すべてをstdoutに出力するオプションがありますが、これらのどちらの方法でも、stderrにエラーが表示されなくなります。つまり、実際に知りたいエラーがあったときに電子メールを受信できません。

では、stderrで出力エラーのみをcurlする方法はありますが、stdoutで通常の出力はそのままにしますか?

27
Malvineous

さらに実験を重ねた後、次の回避策を考え出しましたが、まだより良い代替案を用意しています。

すべての出力(stdoutおよびstderr)を一時ファイルに一時的に格納し、そのファイルの内容をcurlの終了コードに応じてstderrまたはstdoutに送信することで機能します。 curlが失敗した場合、出力全体がstderrに送られます(cronのおかげで私に電子メールで送信されます)が、curlが成功した場合、出力は代わりにstdoutに送られます(cronコマンドでログファイルにリダイレクトされるため、 Eメール。)

#一時ファイル名を取得します
 CURL_LOG = `tempfile` 
 
(
#curlを実行し、すべての出力を一時ファイルに貼り付けます
/usr/bin/curl --verbose ...> "$ CURL_LOG" 2>&1 
)|| (
#curlがゼロ以外のエラーコードで終了した場合、その出力をstderrに送信して、
#cronが電子メールで送信するようにします。
 cat "$ CURL_LOG">/dev/stderr 
 rm "$ CURL_LOG" 
 exit 1 
)
 
#正常にカールが完了したので、出力をstdout(これは
#はcrontabのログファイルにリダイレクトされます)
 cat "$ CURL_LOG" 
 rm "$ CURL_LOG" 
4
Malvineous

これを試して:

# 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

このページでのRussell Davisの回答に感謝man curl、試行錯誤。好奇心旺盛な方のために、ここにwgetバージョンの質問を示します。 https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages

28
dgo.a

curl -s -S

Manページから:

-sサイレントまたはクワイエットモード。進行状況メーターやエラーメッセージを表示しません。 Curlをミュートにします。

-S -sと共に使用すると、curlが失敗した場合にエラーメッセージを表示します。

7
Timmah

curl -f。ドキュメントには「サーバーエラーでサイレントに失敗する(まったく出力しない)」とありますが、実際には「stdoutへの出力がない」という意味です-エラーは引き続きstderrに出力されます。

1
Russell Davis