Befehl „x-terminal-emulator“ und Bash-ODER-Logik

Befehl „x-terminal-emulator“ und Bash-ODER-Logik

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-terminalTeil 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:

  1. Versuchen Sie, das Standardterminal des Benutzers aufzurufen, falls es sich vom Gnome-Terminal unterscheidet.
  2. Wenn „x-terminal-emulator“ nicht vorhanden ist, greifen Sie einfach auf die Ausführung von Gnome-Terminal zurück.
  3. Wenn dies fehlschlägt, zeigen Sie eine Fehlermeldung an.

Ist das tatsächlich der Fehler beim Aufrufen des x-terminal-emulatorsymbolischen Links oder passiert es, weil dieser letztendlich auf zeigt /usr/bin/gnome-terminal.wrapperund 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-terminalnicht als Standard festgelegt ist, greift aber darauf zurück, gnome-terminalwenn x-terminal-emulatordies 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!

verwandte Informationen