Wie kann das Skript erkennen, ob der Terminalemulator in einer Desktopsitzung ausgeführt wird oder nicht?

10

Ich habe Skripte ausgeführt, die eine Textdatei schreiben und sie dann in einem Editor öffnen. Wenn ich in meiner Desktopsitzung ein Terminalemulatorfenster öffne und das Skript ausführe, möchte ich, dass der Editor grafisch ist, z gedit. Wenn ich jedoch über ConnectBot auf meinem Telefon oder ähnlichem angemeldet bin (keine Desktopsitzung), möchte ich, dass der Editor aktiviert ist nano.

Derzeit muss ich 2 verschiedene Skripte verwalten, die bis auf den letzten Schritt identisch sind (oder das grafische ausführen lassen, Fehler ausschalten und die Datei dann manuell öffnen nano). Zwei meist identische Skripte sind vom Standpunkt der Wartung aus ineffizient.

Kann ein Skript erkennen, in welcher dieser Situationen ich mich befinde, und den richtigen Editor öffnen?

(Ich habe Möglichkeiten gefunden, wie ein Skript erkennen kann, ob es in einem Terminalemulatorfenster oder durch Doppelklick ausgeführt wird, aber noch keine Möglichkeit gefunden, festzustellen, ob das Fenster auf einem Desktop ausgeführt wird ... Ich glaube nicht kennen die richtige Terminologie für Google)

Bio-Marmor
quelle
6
Wenn Ihr Skript für andere Personen verwendet werden soll, sollten Sie $EDITORstattdessen das standardmäßig angegebene Programm verwenden nanound auf nanodieses zurückgreifen, wenn es nicht festgelegt ist.
Bakuriu
Vielen Dank, tolle Ratschläge, und es ist toll zu hören, was gute Praxis ist. Nur ich.
Bio-Marmor

Antworten:

13

Sie können die Umgebungsvariable $DISPLAYals Auslöser innerhalb einer ifBedingung verwenden. Wenn diese Variable einen Wert hat, können Sie normalerweise grafische Anwendungen ausführen.

Hier ist ein Beispiel:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

Der Operator -zgibt true zurück, wenn die envvar $DISPLAYleer ist und Ihr Skript ausgeführt wird nano. In allen anderen Fällen wird es ausgeführt gedit.


Nach diesem Kommentar von @ vurp0 :

Auf den meisten modernen Wayland-Desktops (wie dem Standard-Desktop in Fedora und Ubuntu) $DISPLAYist die Abwärtskompatibilität (über XWayland) weiterhin festgelegt. Für ein robusteres Skript ist es jedoch gut, beide zu testen $DISPLAYund $WAYLAND_DISPLAYsicher zu sein.

Ich würde vorschlagen, den Testausdruck folgendermaßen zu ändern:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

Somit werden die Werte der beiden Variablen zu einer gemeinsamen Zeichenfolge verkettet, die vom Operator verarbeitet wird -z.


Verweise:

pa4080
quelle
1
Oder für explizite Logik:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
Bis auf weiteres angehalten.
7

Typischerweise verwenden virtuelle Terminals /dev/ptsPseudo-Terminals . Basierend auf der Ausgabe des ttyBefehls können wir also eine einfache caseAnweisung erstellen , um das Öffnen eines bestimmten Editors zu handhaben:

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

Oder besser formatiert:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

Im Vergleich zur Verwendung von Umgebungsvariablen ist dies etwas zuverlässiger und wenn man bedenkt, dass caseAnweisungen mit ttyBefehlen verwendet werden, die etwas portabler sind. Was wahrscheinlich am besten wäre, ist, beide mit zusätzlichen Tests zu kombinieren, wie z"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;

Sergiy Kolodyazhnyy
quelle
Ist das nicht der falsche Weg? Auf meiner Strg + Alt + F1-Konsole ttygibt /dev/tty1, während gnome-terminal(erste Registerkarte) gibt /dev/pts/0.
Paddy Landau
@PaddyLandau Ja, geditsollte für den /dev/pts*Fall sein. Ich habe sie während des Fehlertests in tty umgeschaltet und sie hier kopiert, ohne zurückzuschalten. Danke, schon bearbeitet.
Sergiy Kolodyazhnyy
3

Folgendes habe ich verwendet:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

Der Grund für diesen Code war folgende Frage: Die Desktop-Verknüpfung zum Bash-Skript stürzt ab und brennt

Sie können es so ändern, dass es so aussieht:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
WinEunuuchs2Unix
quelle