エラーをstderrに出力し、その他すべてをstdoutに出力するようにcurlに指示する方法はありますか?
その理由は、コマンドライン(実際にはcronjob)からcurlを使用して、毎晩FTPサイトにファイルをアップロードしているためです。残念ながら、curlはstderrにステータス情報を出力するため、実際には何も問題がなかったときにエラーに関する電子メールを受信します。 (私はstdoutをログファイルにリダイレクトしていますが、出力がある場合はcronから電子メールで送信されるように、stderrは変更しません。)
Curlをサイレントにするか、すべてをstdoutに出力するオプションがありますが、これらのどちらの方法でも、stderrにエラーが表示されなくなります。つまり、実際に知りたいエラーがあったときに電子メールを受信できません。
では、stderrで出力エラーのみをcurlする方法はありますが、stdoutで通常の出力はそのままにしますか?
さらに実験を重ねた後、次の回避策を考え出しましたが、まだより良い代替案を用意しています。
すべての出力(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"
これを試して:
# 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
curl -s -S
Manページから:
-sサイレントまたはクワイエットモード。進行状況メーターやエラーメッセージを表示しません。 Curlをミュートにします。
-S -sと共に使用すると、curlが失敗した場合にエラーメッセージを表示します。
curl -f
。ドキュメントには「サーバーエラーでサイレントに失敗する(まったく出力しない)」とありますが、実際には「stdoutへの出力がない」という意味です-エラーは引き続きstderrに出力されます。