Bei einigen Bash- oder Logikbefehlen, die ich ausprobiere, tritt ein merkwürdiges Phänomen auf. Normalerweise funktioniert alles einwandfrei:
/bin/bash -c "gnome-terminal || notify-send 'ERROR'"
Dies versucht, Gnome-Terminal auszuführen und führt den zweiten Teil nur dann aus, wenn der erste Befehl fehlschlägt. Wenn beispielsweise „Gnome-Terminal“ nicht installiert ist (oder ich es absichtlich in „XXXXgnome-Terminal“ ändere, um einen Fehler zu verursachen), wird der Fehler „Notify-Send“ angezeigt. Andernfalls wird der zweite Befehl nach dem „||“ nie ausgeführt, da der erste Befehl erfolgreich war.
Aber das hier wirkt anders:
/bin/bash -c "x-terminal-emulator || gnome-terminal || notify-send 'ERROR'"
Dadurch wird ein Terminalfenster geöffnet (aufgerufen durch x-terminal-emulator
). Wenn ich dieses Terminalfenster schließe, wird mit dem nächsten Befehl fortgefahren und ein zweites Terminalfenster geöffnet (aufgerufen durch den gnome-terminal
Teil der Logik).
Ich verstehe, dass x-terminal-emulator ein symbolischer Link ist, der nur auf das Standardterminal verweist. Aber es scheint, dass die Bash-ODER-Logik glaubt, dass es „fehlgeschlagen“ ist, selbst wenn es erfolgreich war.
Ich habe verschiedene Möglichkeiten ausprobiert, den Befehl x-terminal-emulator zu umschließen (z. B. $(x-terminal-emulator)
oder $(which x-terminal-emulator)
), damit er der OR-Logik erfolgreicher den Status „Erfolg“ liefert, sodass die darauf folgenden Befehle nicht ausgeführt werden. Aber bisher hat nichts davon funktioniert.
Ideen?
Der Zweck des Codes besteht darin:
- Versuchen Sie, das Standardterminal des Benutzers aufzurufen, falls es sich vom Gnome-Terminal unterscheidet.
- Wenn „x-terminal-emulator“ nicht vorhanden ist, greifen Sie einfach auf die Ausführung von Gnome-Terminal zurück.
- Wenn dies fehlschlägt, zeigen Sie eine Fehlermeldung an.
Ist das tatsächlich der Fehler beim Aufrufen des x-terminal-emulator
symbolischen Links oder passiert es, weil dieser letztendlich auf zeigt /usr/bin/gnome-terminal.wrapper
und keinen „Erfolgs“-Code an die Bash-Logik zurückgibt?
Bearbeiten: OK, dadurch wird der Befehl viel länger und komplexer, aber der folgende Code scheint zuverlässig zu funktionieren. Er öffnet nur ein einziges Terminalfenster und ruft die alternative Terminal-App auf, wenn sie gnome-terminal
nicht als Standard festgelegt ist, greift aber darauf zurück, gnome-terminal
wenn x-terminal-emulator
dies fehlschlägt. Und ich sollte in der Lage sein, eine beliebige Anzahl anderer Alternativen zum Ausprobieren hinzuzufügen:
/bin/bash -c "if [[ -x $(type -p x-terminal-emulator) ]]; then x-terminal-emulator; elif [[ -x $(type -p gnome-terminal) ]]; then gnome-terminal; else notify-send 'ERROR: App not found' 'Install a terminal app'; fi"
Ich habe es dank des untenstehenden Vorschlags von @waltinator zum Laufen gebracht. Danke!