Error al ejecutar script con nohup

Error al ejecutar script con nohup

Recibí este error al ejecutar mi script con nohup sh:

 syntax error near unexpected token `('

Mi guión es el siguiente:

#!/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]

Es un script para filtrar algunos archivos de registro y generar un correo electrónico de informe sobre el estado de ejecución de esos archivos.

El error parece provenir del uso de <(en el script, pero después de agregar el bash shebang pensé que debería funcionar. El script se ejecuta sin problemas si se ejecuta con el siguiente comando:

. ./script.sh

Se agradece cualquier ayuda o consejo. Gracias.

Respuesta1

El problema es que ejecutar el script nohup sh /path/to/your/script.shanula el intérprete de línea shebang. Cuando se llama as sh, bashse desactivan ciertas funciones (que probablemente sean similares a otras shells) y, por lo tanto, ya no se puede analizar la sustitución del proceso.

La solución es asegurarse de que bashse ejecute sin restricciones. Esto se puede hacer buscando una variable de entorno y llamando al script nuevamente con bash(en lugar 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

Lamentablemente, bashcomo shanaliza toda la ifestructura. Por lo tanto, para evitar el error, la sintaxis incompatible debe ocultarse en una declaración de evaluación.

Esto se puede evitar si la evalacción se elimina de la ifestructura porque el resto del script no se analiza:

#! /bin/bash

if [ "YES" != "$RUNNING_AS_BASH" ]; then
        test -f "$0" || exit 1
        RUNNING_AS_BASH="YES" exec bash "$0"
fi

cat <(echo "-----------")

información relacionada