如何重定向輸出並在命令失敗時退出?

如何重定向輸出並在命令失敗時退出?

這就是我在腳本(通常是 cronjobs)中記錄 stdout 和 stderr 的方式:

#!/bin/bash
mylog() {
    echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1"
}
(
mylog 'start'

some-command || mylog 'error' && exit 1

mylog 'end'
) >> /var/log/my-log.log 2>&1

在某些腳本中,我使用 return 而不是 exit 並且工作正常,但現在它說我不能使用 return,除非我將腳本包含在 src 中或在函數中使用它。所以我將其更改為退出,但問題是它沒有記錄任何內容,看起來它停止了 >> 輸出重定向。另一個問題是我以後將無法將其包含在 src 中,因為我只想停止這個腳本,而不是所有內容。

我使用輸出重定向是因為我想記錄所有內容,即使沒有發生錯誤。有時命令甚至不會返回正確的退出代碼,所以我不能相信這一點。

那我怎麼才能「返回」錯誤呢?我知道“set -e”,但我更喜歡對何時停止腳本有更多的控制。

有什麼想法嗎?

答案1

我無法解釋您所遇到的行為,但這裡有一個可能的解決方案:

#!/bin/bash
我的日誌(){
    echo "[$(日期 '+%Y-%m-%d %H:%M:%S')] $1"
}

mymain() {
        mylog '開始'

        某些命令 || mylog '錯誤' && 回傳 1

        我的日誌“結束”
    ) >> /var/log/my-log.log 2>&1
}

我的主線

或者,從函數定義中刪除重定向mymain並將其放在mymain函數呼叫中:

mymain >> /var/log/my-log.log 2>&1

(那麼您也應該能夠從mymain函數定義中刪除括號。)或者,由於您希望將 IO 重定向到全部的腳本中,您可以將重定向與操作語句分開:

執行 >> /var/log/my-log.log
執行2>&1
我的主線

由於我不明白為什麼你的方法失敗​​了,所以我無法解釋為什麼上述任何方法更有可能按預期工作。然而,它們做同一件事的方式略有不同,這可能就足夠了。順便說一下,我改成`date …`只是$(date …)出於一般原因;我不認為這與你的問題有任何關係。

答案2

screen在linux下使用指令怎麼樣?除非您決心自己編寫解決方案,否則這將是由於技巧造成的。

相關內容