Я получил эту ошибку при запуске моего скрипта с помощью 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
Проблема в том, что запуск скрипта as nohup sh /path/to/your/script.sh
переопределяет интерпретатор строки shebang. При вызове as sh
отключаются bash
некоторые функции (вероятно, это похоже на другие оболочки) и, таким образом, больше не может анализировать подстановку процесса.
Решение состоит в том, чтобы убедиться, что он 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
as sh
разбирает всю 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 "-----------")