Erro ao executar o script com nohup

1

Eu 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 e-mail de relatório sobre o status de execução desses arquivos.

O erro parece vir do uso de <( no script, mas tendo adicionado 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 é apreciado. Obrigado.

    
por ipohfly 29.01.2015 / 09:39

1 resposta

1

O problema é que a execução do script como nohup sh /path/to/your/script.sh substitui o interpretador da linha shebang. Quando chamado como sh , então bash desativa certos recursos (que provavelmente é semelhante com outros shells) e, portanto, não pode mais analisar a substituição do processo.

A solução é garantir que bash esteja sendo executado 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 as sh analisa toda a estrutura if . Assim, para evitar o erro, a sintaxe incompatível deve estar oculta em uma instrução eval.

Isso pode ser evitado se a ação eval for retirada da estrutura if , 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 "-----------")
    
por 29.01.2015 / 11:23