Ошибка при запуске скрипта с 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

Проблема в том, что запуск скрипта 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

К сожалению, bashas 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 "-----------")

Связанный контент