Auch wenn es Dich - ole - vermutlich nicht interessiert und Du das Script auch nicht erstellt hast, möchte ich zu dem Script unabhängig von der Hauptfragestellung hier nochmal kommentieren als Beitrag für die allgemeine Diskussion darüber.
Das Script enthält einen kritischen Fehler:
Code: Alles auswählen
MB_DB_CONNECTION_URI=jdbc:mysql://server:3306/metabase?user=dbuser_meta&password=geheim
Das fehlende Quoting ist hier kritisch und sorgt dafür, dass die Variablenzuweisung aufgrund es enthaltenen & in den Hintergrund gesetzt wird. D. h. in der aktuellen Shell wird die Variable nicht verändert. Zusätzlich wird die Variable im Hintergrund nur auf einen Teil des Wertes gesetzt, weil & das Befehlsende bestimmt. Der Befehl ist also doppelt kaputt. So tut es das, was es soll:
Code: Alles auswählen
MB_DB_CONNECTION_URI="jdbc:mysql://server:3306/metabase?user=dbuser_meta&password=geheim"
Insgesamt ist dieses Script für mich auf eine Weise geschrieben, was es trotz der Kürze sehr schlecht lesbar macht:
- Die Zeilen sind recht lange
- If-Abfragen sind komplett in einer Zeile
- Befehlsverkettung per && kombiniert mehrere Befehle in einer Zeile
- Überflüssige Konstrukte
Die Zeilen sind zu lang
Mir scheint, der Autor des Scriptes empfindet es als einfacher lesbar, wenn das Programm weniger Zeilen hat, Für mich erschwert es das lesen. Die Aufteilung auf mehrere Zeilen ließe eine Struktur erkennen und deswegen ließe sich der Inhalt leichter erfassen. Bei einem großen Bildschirm mag das noch nicht ganz so nervig sein. Wenn der aber etwas kleiner ist, dann mit Sicherheit.
Grundsätzlich verwende ich auch Kombinationen von Befehlen in einer Zeile. Ich tue das aber nur, wenn die Zeile trotzdem kurz bleibt. So etwas würde ich z. b. schreiben:
... oder das schon erwähnte ...
If-Abfragen sind komplett in einer Zeile
Das sorgt auch dafür, dass man länger braucht, um den Inhalt unmittelbar zu erfassen. Was gehört jetzt zum Then-Zweig? Was gehört zum Else-Zweig? Bei einer Aufteilung in einzelne Zeilen kann man das schneller erfassen
Vergleicht selbst!
In einer Zeile:
Code: Alles auswählen
if [ -z ${MB_DB_CONNECTION_URI+x} ]; then export MB_DB_CONNECTION_URI="jdbc:mysql://server:3306/metabase?user=dbuser_meta&password=geheim"; else echo "var is set to '$MB_DB_CONNECTION_URI'"; fi
Aufgeteilt:
Code: Alles auswählen
if [ -z ${MB_DB_CONNECTION_URI+x} ]; then
export MB_DB_CONNECTION_URI="jdbc:mysql://server:3306/metabase?user=dbuser_meta&password=geheim";
else
echo "var is set to '$MB_DB_CONNECTION_URI'"
fi
Befehlsverkettung per && kombiniert mehrere Befehle in einer Zeile
Das Verketten von Befehlen führt auch zur Zeilenverlängerung und führt zusätzlich eine weitere Fehlerquelle ein: Befehle, die keine Ausführungsprüfung erfordern, werden jetzt geprüft:
Code: Alles auswählen
check_process "metabase.jar"
[ $? -eq 0 ] && echo "$(date) : Metabase not running, restarting..." && $(/home/user/bin/jdk-23.0.2/bin/java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar ) &
Wenn der echo Befehl fehlschlägt, wird der anschließende Java-Aufruf nicht ausgeführt. Ist hier nicht schlimm, weil echo wahrscheinlich nicht fehlschlagen wird. Aber wenn man sich so etwas angewöhnt, dann kommt irgendwann der Punkt, an dem so etwas bricht.
Wenn man das so haben möchte, könnte man das so coden - also mit geschweiften Klammern als Gruppierungsmethode (habe ich auch schon so gemacht):
Oder als normale If-Abfrage:
Code: Alles auswählen
if check_process "metabase.jar" ; then
echo "$(date) : Metabase not running, restarting..."
/home/user/bin/jdk-23.0.2/bin/java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar
fi
Überflüssige Konstrukte
So ein Konstrukt empfinde ich als umständlich:
Es wird unnötigerweise ein zusätzlicher Prozess erzeugt. Der Rückgabewert wird explizit abgefragt und neu gesetzt. Das folgende hätte den fast gleichen Effekt:
Da der Befehl am Ende der Funktion steht, wird sein Exit-Code als Exit-Code der Funktion zurück gegeben. Die Ausgabe wird unterdrückt. Fast gleich bedeutet, dass im Original nur 0 oder 1 zurück gegeben wird, während meine Version den Exit-Code von pgrep zurück liefert und der kann 0, 1, 2 oder 3 sein. Das dürfte aber keinen Unterschied machen, da die Unix-Philosophie hier ist: 0 => OK !0 => Fehler
Damit der Code wartbarer wird, schreibe ich meist:
Damit wird er implizite Rückgabewert von pgrep explizit. Nicht alle Funktionen nutzen Rückgabewerte. So wird man darauf aufmerksam gemacht, dass der Rückgabewert wichtig ist und wenn man die Funktion später erweitert, fällt einem das sofort auf. Ansonsten hängt man vielleicht einen Befehl an und übersieht, dass der wichtige Rückgabewert dabei überschrieben wird.
(Es gäbe grundsätzlich noch mehr zu schreiben...)