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.sh
anula el intérprete de línea shebang. Cuando se llama as sh
, bash
se 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 bash
se 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, bash
como sh
analiza toda la if
estructura. 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 eval
acción se elimina de la if
estructura 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 "-----------")