Recebi este erro ao executar meu script com nohup sh:
syntax error near unexpected token `('
Meu script é o seguinte:
#!/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]
É um script para filtrar alguns arquivos de log e gerar um email de relatório sobre o status de execução desses arquivos.
O erro parece vir do uso de <(
no script, mas depois de adicionar o bash shebang achei que deveria funcionar. O script é executado sem problemas se for executado usando o comando abaixo:
. ./script.sh
Qualquer ajuda ou conselho é bem vindo. Obrigado.
Responder1
O problema é que a execução do script nohup sh /path/to/your/script.sh
substitui o interpretador de linha shebang. Quando chamado como sh
então bash
desativa certos recursos (que provavelmente são semelhantes a outros shells) e, portanto, não pode mais analisar a substituição do processo.
A solução é garantir que bash
esteja funcionando sem restrições. Isso pode ser feito verificando uma variável de ambiente e chamando o script novamente com bash
(em vez de 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
Infelizmente, bash
como sh
analisa toda a if
estrutura. Assim, para evitar o erro, a sintaxe incompatível deve ser ocultada em uma instrução eval.
Isso pode ser evitado se a eval
ação for retirada da if
estrutura porque o restante do script não é analisado:
#! /bin/bash
if [ "YES" != "$RUNNING_AS_BASH" ]; then
test -f "$0" || exit 1
RUNNING_AS_BASH="YES" exec bash "$0"
fi
cat <(echo "-----------")