Bash Logik Operatoren kombinieren?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Warum beendet

(echo "Fehler" && exit 1)

dein Skript nicht?

Mit "(" und ")" startest Du eine neue Subshell und das "exit 1" beendet diese Subshell. Einfacher Test: Öffne eine Terminal und schreibe einmal

echo "Fehler" && exit 1

und einmal

(echo "Fehler" && exit 1)

in die Kommandozeile. Im ersten Fall beendet sich das aufrufende Programm und Dein Terminal geht zu. Im zweiten Fall siehst Du nur die Ausgabe "Fehler" aber Dein Terminalprogramm bleibt offen.

Ich würde das völlig anders machen:

errhandler()
{ 
   echo "Fehler"   
   exit 1 
} 
systemctl status service || errhandler 

Das mit Klammern halte ich schon für den richtigen Ansatz, aber lass die 1 hinter dem exit mal weg. Vielleicht läuft der Fehler ja auch auf einen anderen Exitstatus.

Wenn du wissen willst, was im Fehlerfall genau für ein Exitstatus ausgegeben wird, dann ersetze exit 1 einfach durch echo $?


evtldocha  31.10.2022, 12:21
Das mit Klammern halte ich schon für den richtigen Ansatz

Das kann nicht gehen, denn die Klammern starten eine Subshell und daher wird nur diese dann mit "exit" beendet.

AncheCameo  31.10.2022, 12:32
@evtldocha

Stimmt, da war was ...

Naja, dann bleibt immer noch der klassische Weg:

if ! systemctl status service; then
echo "Fehler"
exit 1
fi

Wobei ich die 1 hinter dem exit immer noch weglassen würde.

evtldocha  31.10.2022, 12:42
@AncheCameo

In meinen Skripten nutze ich die Nummern nach exit eher intensiv, da ich an der Nummer in Logfiles sofort erkennen, welcher Fehler aufgetreten ist (sofern sich für das jeweilige Skript aus Gründen des Umfangs ein aufwändiges Fehlerhandling auch lohnt).

Das Problem, dass du hier eine Subshell öffnest wurde ja bereits erwähnt. Deshalb hier eine Alternative, die funktioniert:

befehl || { echo "Fehler" && exit 1; }
Woher ich das weiß:Studium / Ausbildung – Studium in theoretischer Informatik (Master)

Am ende des Scripts end angeben.

Das Exit beendet lediglich nur den Befehl nicht das Script.

Woher ich das weiß:Berufserfahrung

AncheCameo  31.10.2022, 11:58

Seit wann denn das? Wenn ich exit interaktiv eingebe, wird die Shell beendet, im Falle einer Konsole bedeutet dies, dass der User abgemeldet wird. In einer Schleife wird zum Abbruch eines Durchlaufs dagegen break verwendet. Exit beendet dagegen das ganze Skript.

AncheCameo  31.10.2022, 12:38
@evtldocha

Mein Kommentar bezieht sich auch auf die Antwort von Renecap (leider ist das in gutefrage ein wenig unglücklich dargestellt). Weder beendet exit nur den Befehl, noch gibt es end in der bash.

frage416 
Beitragsersteller
 31.10.2022, 11:55

Den "end" Befehl scheint es nicht zu geben

-bash: end: command not found