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 라인 인터프리터가 무시된다는 것입니다. 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
합니다 . 따라서 오류를 방지하려면 호환되지 않는 구문을 eval 문에서 숨겨야 합니다.sh
if
스크립트의 나머지 부분이 구문 분석되지 않기 때문에 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 "-----------")