Erro ao executar script com nohup

Erro ao executar script com nohup

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.shsubstitui o interpretador de linha shebang. Quando chamado como shentão bashdesativa 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 bashesteja 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, bashcomo shanalisa toda a ifestrutura. Assim, para evitar o erro, a sintaxe incompatível deve ser ocultada em uma instrução eval.

Isso pode ser evitado se a evalação for retirada da ifestrutura 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 "-----------")

informação relacionada