Erkennen einer X-Sitzung in einem Bash-Skript (.bashrc usw.)

Erkennen einer X-Sitzung in einem Bash-Skript (.bashrc usw.)

Ich habe es vor Kurzem xset b offin meine .bashrc-Datei eingefügt. Jetzt ärgert mich der Fehler, der auftritt, wenn ich mich über TTY oder SSH anmelde, also außerhalb einer X-Sitzung.

Das Erste, was mir in den Sinn kam, war [[ -z "$SOME_VAR" ]] && xset b off(nun, es stellte sich heraus, dass das TestenVariable ist gesetzt vs. ist leerist eine andere Frage). Aber welches SOME_VAR ist das richtige?

Ich habe also die Ausgabe von tty setund die Ausgabe von urxvt verglichen set, um zu sehen, welche Variablen in X gesetzt sind und in tty fehlen. Wie erwartet gab es ziemlich viele Unterschiede (ich habe nur diejenigen aufgelistet, die mir relevant erschienen):

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

Welches ist das korrekteste und universellste Testverfahren, um festzustellen, ob ich mich in einer X-Sitzung befinde oder nicht? Etwas, das auf möglichst vielen Distributionen, Plattformen und Desktopumgebungen funktioniert?

Oder gibt es eine noch bessere Möglichkeit als das Testen von Umgebungsvariablen?

Antwort1

Eine einfache und effektive Möglichkeit, die Verfügbarkeit und Gültigkeit Ihres Anzeigeservers zu testen, besteht darin, ihn mit zu testen xhost. Sie können sich nicht immer darauf verlassen, dass in der DISPLAYVariable nach einem Wert gesucht wird, da dieser mit einem ungültigen Wert festgelegt sein könnte.

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

Der Grund dafür ist, dass ich in meinem Benutzer mehrere Skripte ausführe crontab, die auf dem Display arbeiten, wenn es vorhanden ist, aber anders funktionieren, wenn es nicht vorhanden ist. Oben in meinem crontabsetze ich die DISPLAYVariable auf :0, obwohl sie noch nicht vorhanden ist. Skripte in , crontabdie mit beginnen, @rebootwerden gestartet, unabhängig davon, ob Sie ein Display haben oder nicht. Auf diese Weise können Sie dynamisch erkennen, wann Ihr Display innerhalb desselben Skripts kommt und geht.

HINWEIS: Das >&funktioniert nur in bash>= 4. Andernfalls verwenden Sie> /dev/null 2>&1

Antwort2

Ich denke, eine Überprüfung DISPLAYwäre der beste Ansatz.

  • Es verarbeitet Remote-Anmeldungen (z. B. ssh -X).
  • Es ist auf den meisten – wenn nicht allen – Plattformen verfügbar.
  • Es ist unabhängig vom Fenstermanager/DE.

Antwort3

Normalerweise verwende ich die TERMVariable, um in meinen Skripten auf X zu testen.

TERMlinuxist normalerweise auf TTY und xtermX eingestellt. Ich verwende hier das Wort „normalerweise“, da Anwendungen wie GNU Screen und TMux mit der Variable
herumzuspielen scheinen .TERM

Antwort4

In einem gewöhnlichen Bash-Skript:if [[ $DISPLAY ]]

Auf demselben Computer $DISPLAYwird beispielsweise 0:0in einem Terminalemulator zurückgegeben, in einem echten Terminal jedoch nichts. Dies kann leicht mit CtrlAltF1versus getestet werden CtrlAltF7.

Eine bashBedingung basierend auf $DISPLAYwürde wie folgt aussehen:

if [[ $DISPLAY ]]; then 
fi

In .profileoder .personal:if xhost >& /dev/null

Meiner Erfahrung nach $DISPLAYist noch nicht festgelegt .profile, wann oder in der Erweiterung .personalausgeführt werden. Für diese Fälle ist dieAntwort vom Benutzer cmevolidient am besten:

if xhost >& /dev/null; then
fi

Beim Definieren eines Desktops trat dieses Problem aufCapsLock Tastenbelegungdas sollte für meinen Server nicht gelten.

verwandte Informationen