.png)
Ich habe es vor Kurzem xset b off
in 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 set
und 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 DISPLAY
Variable 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 crontab
setze ich die DISPLAY
Variable auf :0
, obwohl sie noch nicht vorhanden ist. Skripte in , crontab
die mit beginnen, @reboot
werden 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 DISPLAY
wä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 TERM
Variable, um in meinen Skripten auf X zu testen.
TERM
linux
ist normalerweise auf TTY und xterm
X 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 $DISPLAY
wird beispielsweise 0:0
in einem Terminalemulator zurückgegeben, in einem echten Terminal jedoch nichts. Dies kann leicht mit CtrlAltF1versus getestet werden CtrlAltF7.
Eine bash
Bedingung basierend auf $DISPLAY
würde wie folgt aussehen:
if [[ $DISPLAY ]]; then
…
fi
In .profile
oder .personal
:if xhost >& /dev/null
Meiner Erfahrung nach $DISPLAY
ist noch nicht festgelegt .profile
, wann oder in der Erweiterung .personal
ausgeführt werden. Für diese Fälle ist dieAntwort vom Benutzer cmevoli
dient am besten:
if xhost >& /dev/null; then
fi
Beim Definieren eines Desktops trat dieses Problem aufCapsLock Tastenbelegungdas sollte für meinen Server nicht gelten.