2011-08-04 59 views
17

有沒有辦法告訴curl將錯誤輸出到標準錯誤,其他一切都輸出到標準輸出?使curl發送錯誤stderr和其他一切標準輸出

原因是我使用curl從命令行(實際上是一個cronjob)每天晚上上傳文件到FTP站點。不幸的是,因爲curl會輸出stderr上的狀態信息,所以當沒有任何錯誤發生時,我會收到有關錯誤的電子郵件。 (我將stdout重定向到日誌文件,但將stderr保持不變,以便cron將電子郵件發送給我(如果有任何輸出的話)。)

有一些選項可以使curl無提示,或將所有內容輸出到stdout,然而,這兩種替代方法可以防止錯誤出現在stderr上 - 這意味着當我真正想知道的錯誤時,我不會收到電子郵件。

那麼有沒有辦法讓stltr只產生curl輸出錯誤,但在stdout上保留正常的輸出?

回答

3

經過一些更多的實驗後,我提出了以下解決方法,但我仍然對更好的選擇開放。

它通過將所有輸出(stdout和stderr)臨時存儲在一個臨時文件中,然後根據curl的退出代碼將該文件的內容發送到stderr或stdout來工作。如果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" 
+0

它不像其他答案那樣簡短和甜蜜,但它是唯一能夠完成工作的答案。感謝分享。 – 7yl4r

0

curl -f。該文件說「服務器錯誤無提示(無輸出)」,但它確實意味着「沒有輸出到標準輸出」 - 錯誤仍然會輸出到標準錯誤。

20

試試這個:

# 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

+0

「--silent」不會阻止正常進度消息發送到標準輸出嗎?我仍然希望看到這些,以便我知道curl實際上正在做一些事情! – Malvineous

+0

我的答案還有另一個問題:我從來沒有使用curl來上傳FTP。這浪費了你的時間。我很抱歉忽略了您的問題的重要方面。我會刪除這個答案以避免更進一步的混淆。 –

+0

別擔心 - 它可能會幫助別人,就像羅素戴維斯的回答給了你一些想法:-) – Malvineous

1

curl -s -S

從手冊頁:

-s沉默或安靜模式。不要顯示進度表或錯誤消息。使捲曲靜音。

-S當與-s一起使用時,如果curl失敗,它會顯示錯誤消息。

+0

看看@dgo下的評論。a的答案 - 這也消除了正常的進度消息,告訴你事情是否按預期工作,我想保留在標準輸出。 – Malvineous

相關問題