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