Fehler beim Ausführen des Skripts mit nohup

Fehler beim Ausführen des Skripts mit nohup

Beim Ausführen meines Skripts mit nohup sh ist dieser Fehler aufgetreten:

 syntax error near unexpected token `('

Mein Skript sieht wie folgt aus:

#!/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 handelt sich um ein Skript zum Filtern einiger Protokolldateien und zum Generieren einer Berichts-E-Mail über den Ausführungsstatus dieser Dateien.

Der Fehler scheint von der Verwendung von <(im Skript herzurühren, aber nachdem ich den Bash-Shebang hinzugefügt hatte, dachte ich, es müsste funktionieren. Das Skript läuft ohne Probleme, wenn es mit dem folgenden Befehl ausgeführt wird:

. ./script.sh

Für jede Hilfe und jeden Ratschlag bin ich dankbar. Danke.

Antwort1

Das Problem besteht darin, dass das Ausführen des Skripts als nohup sh /path/to/your/script.shden Shebang-Zeileninterpreter überschreibt. Wenn es als aufgerufen wird, shwerden bashbestimmte Funktionen deaktiviert (das ist bei anderen Shells wahrscheinlich ähnlich) und die Prozessersetzung kann daher nicht mehr analysiert werden.

Die Lösung besteht darin, sicherzustellen, dass es bashohne Einschränkungen läuft. Dies kann erreicht werden, indem man nach einer Umgebungsvariable sucht und das Skript erneut mit bash(anstelle von sh) aufruft:

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

Leider analysiert bashas die gesamte Struktur. Um den Fehler zu vermeiden, muss die inkompatible Syntax daher in einer eval-Anweisung versteckt werden.shif

Dies kann vermieden werden, indem die evalAktion aus der Struktur herausgenommen wird if, da der Rest des Skripts nicht analysiert wird:

#! /bin/bash

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

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

verwandte Informationen