Saya menulis bash
skrip yang perlu tahu lingkungan desktop mana (XFCE, Unity, KDE, LXDE, Mate, Cinnamon, GNOME2, GNOME3, ...) sedang berjalan.
Bagaimana saya bisa mendapatkan informasi itu?
bash
desktop-environment
bash-script
Serge Stroobandt
sumber
sumber
xplanet
dan ingin menyegarkan latar belakang desktop secara otomatis dengan perintah khusus untuk lingkungan desktop. Jika Anda ingin mengirim jawaban untuk masalah itu , silakan ikuti tautannya.Jawaban:
Masalah utama dengan memeriksa
DESKTOP_SESSION
adalah bahwa hal itu diatur oleh manajer tampilan daripada sesi desktop dan tunduk pada inkonsistensi. Untuklightdm
di Debian, nilai berasal dari nama file di bawah/usr/share/xsessions/
.DESKTOP_SESSION
mencerminkan lingkungan desktop jika pilihan tertentu dibuat saat login, namunlightdm-xsession
selalu menggunakan sesi default.GDMSESSION
adalah pilihan lain, tetapi tampaknya memiliki kesulitan yang sama (itu adalah nilai yang sama denganDESKTOP_SESSION
saya).XDG_CURRENT_DESKTOP
sepertinya pilihan yang baik, namun saat ini tidak dalam standar XDG dan dengan demikian tidak selalu diterapkan. Lihat di sini untuk diskusi tentang ini. Jawaban ini menunjukkan nilainya untuk distro / desktop yang berbeda, saya juga dapat mengonfirmasi saat ini tidak tersedia untuk saya di XFCE.Fallback masuk akal untuk
XDG_CURRENT_DESKTOP
tidak ada akan mencobaXDG_DATA_DIRS
. Asalkan file data untuk lingkungan desktop dipasang di direktori bertuliskan namanya, pendekatan ini harus bekerja. Mudah-mudahan ini akan menjadi kasus untuk semua distro / desktop!Tes berikut (dengan GNU grep) untuk XFCE, KDE dan Gnome:
Kompatibel dengan POSIX:
Untuk menggabungkan dengan memeriksa
XDG_CURRENT_DESKTOP
:sumber
apt-file
juga merupakan alat yang baik untuk melihat di mana berbagai desktop diinstal.XDG_DATA_DIRS
tidak ada atau tidak mengandung sesuatu yang bermanfaat?||
gaya. Masih pertanyaan ini telah diajukan di situs SE lainnya, saya pikir kami memiliki set jawaban terbaik.Metode # 1 - $ DESKTOP_SESSION
Saya pikir Anda bisa mengetahuinya dengan menginterogasi variabel lingkungan
$DESKTOP_SESSION
. Saya tidak sepenuhnya positif seberapa luas ini didukung tetapi dalam pengujian terbatas saya tampaknya tersedia di Fedora & Ubuntu.Pilihan lain adalah
$XDG_SESSION_DESKTOP
variabel.Metode # 2 - wmctrl
Ada juga metode ini yang memanfaatkan
wmctrl
.Referensi
sumber
$GDMSESSION
membuat saya gugup karena sepertinya hanya diarahkan pada DE yang menggunakan DE berbasis GDM atau GNOME. GDM = Manajer Tampilan GNOME.DESKTOP_SESSION
di xfce.default
(mint 15)default
ini. Instalasi default GNOME 3.$DESKTOP_SESSION
menunjukkandefault
untuk KDE di bawah Fedora 20.Anda dapat menggunakan skrip bash ini . Itu dapat mendeteksi nama dan versi lingkungan desktop.
sumber
ps -e | grep -E '^.* xfce4-session$' > /dev/null
(($? == 0)) && ...
GNOME Shell 3.26.2
akuUNKNOWN
. Tidak ada hasil darignome-session --version
bekerja untuk saya adalahgnome-shell --version | awk '{print $3}'
saya juga tidak mendapatkan apa-apaps -e | grep -E '^.* gnome-session$'
. Ini sepertinya karena-b
pada akhirgnome-session-b
. Menghapus$
karya atau sekadarps -e | grep 'gnome-session'
. Dengan perubahan ini skrip berfungsi. Saya mendapatkanGNOME 3.26.2
Itu mungkin tergantung pada situasinya. Jika Anda tahu manajer tampilan mana yang digunakan maka mungkin ini yang menempatkan informasi ini dalam variabel lingkungan.
Jika bukan itu masalahnya maka saya kira Anda harus memeriksa setiap DE yang ingin Anda identifikasi. Mereka semua harus memperkenalkan variabel lingkungan mereka sendiri.
sumber
echo ${DESKTOP_SESSION:0:1}
akan melakukan trik? Sejauh yang saya bisa uji, itu mengembalikanu
untuk Unity danx
untuk XFCE. Semoga beberapa orang akan berpadu untuk KDE dan desktop lainnya.echo ${DESKTOP_SESSION} kde-plasma-safe
untuk KDE saya. Kenapa "aman" ...Jika variabel lingkungan
XDG_CURRENT_DESKTOP
tersedia, itu akan memberi tahu Anda.sumber
Anda bisa mencari
Xorg
proses yang sedang berjalan . Induk dari ini adalah manajer tampilan Anda. Keturunannya harus memberikan indikasi lingkungan desktop apa yang sedang berjalan. Di sistem saya, manajer tampilan mengeksekusi sendiri (dengan parameter yang berbeda). Ini kemudian memunculkanx-session-manager
yang disinkronkan denganxfce4-session
. Ini mungkin cukup, tetapi semua anak-anak ini terkait dengan lingkungan desktop saya. Menemukan mereka melalui pohon proses harus menjadi cara terbaik untuk mengecualikan elemen dari sistem jendela lain yang dimulai oleh berbagai program (atau mungkin dengan sengaja).Pikiran pertama saya adalah bahwa akan lebih baik untuk mencari window manager yang terkait dengan lingkungan desktop Anda, tetapi seringkali yang berbeda dapat dikonfigurasi untuk dijalankan (misalnya
xmonad
di Gnome) jadi ini tidak kuat. Yang terbaik untuk dicari mungkin adalah yang mengelola desktop aktual, mis.xfdesktop
Atau elemen apa pun dari lingkungan desktop yang Anda perlukan agar skrip Anda berfungsi :)Contoh
Berikut ini adalah contoh menggunakan procps-ng (
-C
dan--ppid
bukan POSIX). Ini mengasumsikan hanya satu contoh dariXorg
.Ini hanyalah contoh yang berfungsi untuk desktop xfce. Contoh kerja penuh memerlukan penyelidikan dalam proses yang digunakan setiap sistem desktop, seperti halnya sebagian besar solusi lain memerlukan penyelidikan tentang bagaimana variabel lingkungan diatur dalam berbagai sistem desktop lainnya.
sumber
unknown
di Ubuntu.another_desktop
hasil yang belum selesai .Dari semua percobaan yang dilaporkan dalam banyak komentar, saya pikir itu tugas saya sebagai OP untuk menghasilkan jawaban konsensus. (Yakinlah, saya akan dengan senang hati meninjau jawaban ini seandainya data kontras tersedia.)
Untuk saat ini, tampaknya yang terbaik adalah mengambil pimpinan kita dari
$XDG_CURRENT_DESKTOP
saat variabel ini didefinisikan. Jika tidak,$XDG_DATA_DIRS
dapat memberikan informasi yang diinginkan, lebih dari huruf pertama${DESKTOP_SESSION:0:1}
.sumber
XDG_CURRENT_DESKTOP
. Saya pikir masalah utama dengan ini adalah variabel yang ditetapkan oleh manajer tampilan daripada lingkungan desktop dan ada beberapa ketidakkonsistenan. Ketika saya memilih sesi default (xfce) dengan lightdmecho $DESKTOP_SESSION
memberikanlightdm-xsession
yang merupakan gabungan darilightdm
danx-session-manager
, proses yang digunakan untuk memulai desktop saya (disinkronkan kexfce4-session
). Saya membayangkan menginstal dengan sesi default yang berbeda hanya akan menggunakan symlink yang berbeda dan menghasilkan yang samaDESKTOP_SESSION
DESKTOP_SESSION
akan benar-benar mengatakanxfce
ataugnome
Ini berfungsi baik pada Ubuntu 18.10 (kosmik) [tipe lxqt] dan Mint 19 (tara) [tipe kayu manis]:
Tangkap hasilnya menjadi variabel, dan jalankan kode yang diperlukan lebih lanjut melalui logika analitik yang mampu (case stmt, if / then) yang mencakup setiap / semua jenis yang dikenali dari sana; dan / atau berfungsi dengan anggun ketika tipe yang tidak dikenal digunakan.
sumber