使用 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 "-----------")

相关内容