使用 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
不幸的是bash
assh
解析了整個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 "-----------")