使用 nohup 運行腳本時出錯

使用 nohup 運行腳本時出錯

使用 nohup sh 運行腳本時出現此錯誤:

 syntax error near unexpected token `('

我的腳本如下:

#!/bin/bash
report_log="report.log";
grep -A 3 'successful\|ERROR COUNT EXCEEDED' *.log  > ${report_log};
echo ${report_log};
MAX_ERR_COUNT_EXCEED_MSG="No Max Count Error.";
if grep "ERROR COUNT EXCEEDED" ${report_log}; then
   MAX_ERR_COUNT_EXCEED_MSG="MAX ERROR COUNT EXCEEDED, CHECK RECORD COUNT!";
fi
RESULT_MSG="Execution successful";
if grep '\([1-9]\d*\b\)' ${report_log} | grep 'data errors'; then
   RESULT_MSG="Execution with ERROR";
fi
cat ${report_log} <(echo "-----------") <(echo "${MAX_ERR_COUNT_EXCEED_MSG}") <(echo "${RESULT_MSG}") | mailx -s "Test Result" [email protected]

它是一個腳本,用於過濾一些日誌檔案並產生有關這些文件的執行狀態的報告電子郵件。

該錯誤似乎來自<(腳本中的使用,但添加了 bash shebang 我認為它應該可以工作。如果使用以下命令運行,則腳本運行不會出現問題:

. ./script.sh

任何幫助或建議表示讚賞。謝謝。

答案1

問題是運行腳本會nohup sh /path/to/your/script.sh覆蓋 shebang 行解釋器。當呼叫 assh時,bash會關閉某些功能(這可能與其他 shell 類似),因此無法再解析進程替換。

解決方案是確保其bash運作不受限制。這可以透過檢查環境變數並使用bash(而不是sh)再次呼叫腳本來完成:

#! /bin/bash

if [ "YES" = "$RUNNING_AS_BASH" ]; then
        eval 'cat <(echo "-----------")'
else
        test -f "$0" || exit 1
        RUNNING_AS_BASH="YES" exec bash "$0"
fi

不幸的是bashassh解析了整個if結構。因此,為了避免錯誤,必須將不相容的語法隱藏在 eval 語句中。

eval如果從結構中取出操作,則可以避免這種情況,if因為腳本的其餘部分不會被解析:

#! /bin/bash

if [ "YES" != "$RUNNING_AS_BASH" ]; then
        test -f "$0" || exit 1
        RUNNING_AS_BASH="YES" exec bash "$0"
fi

cat <(echo "-----------")

相關內容