Ich schreibe ein bash
Skript, das wissen muss, welche Desktop-Umgebung (XFCE, Unity, KDE, LXDE, Mate, Cinnamon, GNOME2, GNOME3, ...) ausgeführt wird.
Wie kann ich diese Informationen erhalten?
bash
desktop-environment
bash-script
Serge Stroobandt
quelle
quelle
xplanet
und möchte den Desktop-Hintergrund automatisch mit Befehlen aktualisieren, die für die Desktop-Umgebung spezifisch sind. Wenn Sie eine Antwort auf dieses Problem veröffentlichen möchten, folgen Sie bitte dem Link.Antworten:
Das Hauptproblem bei der Überprüfung von
DESKTOP_SESSION
ist, dass es vom Anzeigemanager und nicht von der Desktopsitzung festgelegt wird und Inkonsistenzen unterliegt. Beilightdm
Debian stammen die Werte aus den Namen der Dateien unter/usr/share/xsessions/
.DESKTOP_SESSION
spiegelt die Desktop-Umgebung wider, wenn beim Anmelden eine bestimmte Auswahl getroffen wird, es wird jedochlightdm-xsession
immer die Standard-Sitzung verwendet.GDMSESSION
ist eine andere Option, scheint aber eine ähnliche Situation zu haben (es ist der gleiche Wert wieDESKTOP_SESSION
für mich).XDG_CURRENT_DESKTOP
sieht nach einer guten Wahl aus, ist aber derzeit nicht im XDG-Standard und daher nicht immer implementiert. Sehen Sie hier für eine Diskussion über diese. In dieser Antwort werden die Werte für verschiedene Distributionen / Desktops angezeigt. Ich kann auch bestätigen, dass sie für mich derzeit auf XFCE nicht verfügbar sind.Der vernünftige Fallback für
XDG_CURRENT_DESKTOP
nicht existierende wäre, es zu versuchenXDG_DATA_DIRS
. Vorausgesetzt, die Datendateien für die Desktop-Umgebung werden in einem Verzeichnis mit diesem Namen installiert, sollte dieser Ansatz funktionieren. Dies gilt hoffentlich für alle Distributionen / Desktops!Die folgenden (mit GNU grep) Tests für XFCE, KDE und Gnome:
POSIX-kompatibel:
Mit dem Prüfen kombinieren
XDG_CURRENT_DESKTOP
:quelle
apt-file
ist auch ein gutes Werkzeug, um zu sehen, wo die verschiedenen Desktops installiert werden.XDG_DATA_DIRS
existiert nicht oder enthält es einfach nichts nützliches?||
Stil tun möchte . Trotzdem wurde diese Frage auf anderen SE-Sites gestellt. Ich denke, wir haben die besten Antworten.Methode 1 - $ DESKTOP_SESSION
Ich denke, Sie können es herausfinden, indem Sie die Umgebungsvariable abfragen
$DESKTOP_SESSION
. Ich bin nicht ganz sicher, wie weit verbreitet dies ist, aber in meinen begrenzten Tests scheint es auf Fedora & Ubuntu verfügbar zu sein.Eine andere Wahl ist die
$XDG_SESSION_DESKTOP
Variable.Methode 2 - wmctrl
Es gibt auch diese Methode, die davon Gebrauch macht
wmctrl
.Verweise
quelle
$GDMSESSION
macht mich nervös, da es wahrscheinlich nur auf DE ausgerichtet ist, die entweder GDM oder GNOME-basiertes DE verwenden. GDM = GNOME Display Manager.DESKTOP_SESSION
auf xfce.default
(Mint 15)default
dies auch. Eine Standardinstallation von GNOME 3.$DESKTOP_SESSION
zeigtdefault
für KDE unter Fedora 20.Sie können dieses Bash-Skript verwenden . Es kann den Namen und die Version der Desktop-Umgebung erkennen.
quelle
ps -e | grep -E '^.* xfce4-session$' > /dev/null
(($? == 0)) && ...
GNOME Shell 3.26.2
ich gekommen binUNKNOWN
. Keine Ausgabe vongnome-session --version
Arbeiten für mich ist,gnome-shell --version | awk '{print $3}'
ich habe auch nichts raus bekommenps -e | grep -E '^.* gnome-session$'
. Dies scheint-b
am Ende von zu liegengnome-session-b
. Entferne den$
Werke oder einfach nurps -e | grep 'gnome-session'
. Mit diesen Änderungen arbeitet das Skript. Ich bekommeGNOME 3.26.2
Das hängt wahrscheinlich von der Situation ab. Wenn Sie wissen, welcher Anzeigemanager verwendet wird, kann es sein, dass dieser diese Informationen in eine Umgebungsvariable einfügt.
Wenn dies nicht der Fall ist, müssen Sie vermutlich nach jedem DE suchen, das Sie identifizieren möchten. Alle sollten ihre eigenen Umgebungsvariablen einführen.
quelle
echo ${DESKTOP_SESSION:0:1}
ich den Trick machen würde. Soweit ich testen konnte, kehrt esu
für Unity undx
für XFCE zurück. Hoffentlich werden einige Leute KDE und andere Desktops suchen.echo ${DESKTOP_SESSION} kde-plasma-safe
für mein KDE. Warum "sicher" ...Wenn die Umgebungsvariable
XDG_CURRENT_DESKTOP
verfügbar ist, sollte sie Ihnen mitteilen.quelle
Du könntest nach Laufen suchen
Xorg
Prozessen . Das übergeordnete Element sollte Ihr Display-Manager sein. Seine Nachkommen sollten einen Hinweis darauf geben, welche Desktop-Umgebung ausgeführt wird. Auf meinem System führt sich der Anzeigemanager selbst aus (mit verschiedenen Parametern). Dies wird dann erzeugt,x-session-manager
was mit symbolisch verbunden istxfce4-session
. Dies mag ausreichen, aber alle Kinder davon hängen mit meiner Desktop-Umgebung zusammen. Das Auffinden über den Prozessbaum sollte der beste Weg sein, Elemente anderer Fenstersysteme auszuschließen, die von verschiedenen Programmen (oder möglicherweise absichtlich) gestartet wurden.Mein erster Gedanke war, dass es am besten ist, nach dem Fenstermanager zu suchen, der Ihrer Desktop-Umgebung zugeordnet ist. Oft kann jedoch auch ein anderer für die Ausführung konfiguriert werden (z. B.
xmonad
in Gnome), sodass dies nicht robust ist. Das Beste, wonach Sie suchen, ist wahrscheinlich das, das den eigentlichen Desktop verwaltet, z. B.xfdesktop
oder welches Element der Desktop-Umgebung Sie tatsächlich benötigen, damit Ihr Skript funktioniert :)Beispiel
Hier ist ein Beispiel für die Verwendung von procps-ng (
-C
und--ppid
nicht POSIX). Es wird davon ausgegangen, dass dies nur eine Instanz von istXorg
.Dies ist nur ein Beispiel, das für den xfce-Desktop funktioniert. Ein vollständiges Arbeitsbeispiel erfordert eine Untersuchung der Prozesse, die von jedem Desktopsystem verwendet werden, ebenso wie die meisten anderen Lösungen eine Untersuchung darüber erfordern, wie Umgebungsvariablen in verschiedenen anderen Desktopsystemen festgelegt werden.
quelle
unknown
auf Ubuntu zurück.another_desktop
Ergebnis übersehen .Aus all den Experimenten, über die in den zahlreichen Kommentaren berichtet wurde, halte ich es für meine Pflicht als OP, eine Konsensantwort zu finden. (Seien Sie versichert, ich würde mich freuen, diese Antwort zu lesen, falls kontrastierende Daten verfügbar werden.)
Im Moment scheint es am besten zu sein, unseren Vorsprung
$XDG_CURRENT_DESKTOP
bei der Definition dieser Variablen zu übernehmen . Wenn nicht,$XDG_DATA_DIRS
kann die gewünschte Information mehr als der erste Buchstabe von${DESKTOP_SESSION:0:1}
.quelle
XDG_CURRENT_DESKTOP
. Ich denke, dass das Hauptproblem bei diesen Variablen darin besteht, dass sie vom Anzeigemanager und nicht von der Desktop-Umgebung festgelegt werden und es daher einige Inkonsistenzen gibt. Wenn ich eine Standardsitzung (Xfce) mit lightdm wählenecho $DESKTOP_SESSION
gibt ,lightdm-xsession
das ist ein Zusammenschluss vonlightdm
und denx-session-manager
verwendeten Verfahren meines Desktop starten (Symlink zuxfce4-session
). Ich stelle mir vor, dass bei der Installation mit einer anderen Standardsitzung nur ein anderer Symlink verwendet wird und dasselbeDESKTOP_SESSION
DESKTOP_SESSION
wird tatsächlichxfce
odergnome
Dies funktioniert sowohl auf Ubuntu 18.10 (Cosmic) [lxqt type] als auch auf Mint 19 (Tara) [Cinnamon type]:
Erfassen Sie das Ergebnis in einer Variablen und führen Sie den weiteren erforderlichen Code über eine fähige analytische Logik (case stmt, if / then) aus, die alle von dort erkannten Typen enthält. und / oder ordnungsgemäß funktionieren, wenn nicht erkannte Typen verwendet werden.
quelle