Bir bash betiğinde masaüstü ortamını nasıl tespit edebilirim?


24

bashHangi masaüstü ortamının (XFCE, Unity, KDE, LXDE, Mate, Tarçın, GNOME2, GNOME3, ...) çalıştığını bilmesi gereken bir senaryo yazıyorum .

Bu bilgiyi nasıl edinebilirim?


1
bu çok zor çünkü bir GNOME oturumunda olsanız ve kwrite gibi bir KDE programı başlattıysanız bile, KDE daemon ve kdeinit gibi tüm KDE altyapıları çalışacak.
Thorsten Staerk

3
Çok fazla yapamazsın, güvenilir değil. Neden bilmen gerekiyor? Bu bir XY problemi gibi görünüyor .
Gilles 'SO- kötülük yapmayı bırak'

@Gilles İyi bir soru. Özel bir komut dosyası yazıyorum ve masaüstü ortamına özel komutlarla masaüstü arkaplanını otomatik olarak yenilemekxplanet istiyorum . Bu sorunun cevabını göndermek isterseniz , lütfen bağlantıyı takip edin.
Serge Stroobandt

Yanıtlar:


11

Bunu kontrol etmedeki asıl sorun DESKTOP_SESSION, masaüstü oturumundan ziyade ekran yöneticisi tarafından ayarlanması ve tutarsızlıklara maruz kalmasıdır. İçin lightdmDebian üzerinde, değerler altında dosyaların adlarında alınması /usr/share/xsessions/. DESKTOP_SESSIONoturum açma sırasında belirli bir seçim yapıldığında masaüstü ortamını yansıtır, ancak lightdm-xsessionher zaman varsayılan oturum kullanılır.

GDMSESSIONBaşka bir seçenek, ancak benzer bir çıkmaz var gibi görünüyor (benim için aynı değerde DESKTOP_SESSION).

XDG_CURRENT_DESKTOPiyi bir seçim gibi görünüyor, ancak şu anda XDG standardında değil ve bu nedenle her zaman uygulanmıyor. Bunun tartışması için buraya bakın . Bu cevap , farklı dağıtım / masaüstü bilgisayarlar için değerlerini gösteriyor, XFCE'de şu anda benim için mevcut olmadığını da teyit edebilirim.

XDG_CURRENT_DESKTOPMevcut değil için makul bir geri dönüş denemek olacaktır XDG_DATA_DIRS. Masaüstü ortamı için veri dosyalarının adını taşıyan bir dizine kurulması şartıyla bu yaklaşım çalışmalıdır. Bu umarım tüm dağıtım / masaüstü bilgisayarlar için geçerli olacaktır!

Aşağıdaki (GNU grep ile) XFCE, KDE ve Gnome için yapılan testler:

echo "$XDG_DATA_DIRS" | grep -Eo 'xfce|kde|gnome'

POSIX uyumlu:

echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/'

Kontrol ile birleştirmek için XDG_CURRENT_DESKTOP:

if [ "$XDG_CURRENT_DESKTOP" = "" ]
then
  desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
  desktop=$XDG_CURRENT_DESKTOP
fi

desktop=${desktop,,}  # convert to lower case
echo "$desktop"

Bunu severim. Bu genel bakışa göre , sadece Tarçın ile ilgili bir sorun olacak. Ancak, bu sonuçta Linux Mint ile bir hata raporu açarak çözülebilir.
Serge Stroobandt

@ on4aa MATE listede yer almıyor, aynı sorunun olması muhtemel. apt-fileAyrıca, çeşitli masaüstlerinin nereye yüklendiğini görmek için iyi bir araçtır.
Graeme

1
Bu çözüm hala Debian merkezli dağıtımlara yönelmektedir. Tartışılan yöntemlerin hiçbiri erişime sahip olduğum Red Hat bazlı dağıtımların hiçbiri üzerinde çalışmamaktadır (Fedora, CentOS, vb.).
slm

@slm ilginç, mevcut XDG_DATA_DIRSdeğil veya faydalı bir şey içermiyor mu?
Graeme

1
@slm çok doğru, OP'nin muhtemelen her masaüstünde yapmak istediğini bir ||tarzda yapmaya çalışmasının daha iyi olacağını düşünüyorum . Yine de bu soru diğer SE sitelerinde sorulmuştur, bence en iyi cevaplara sahibiz.
Graeme

10

Yöntem 1 - $ DESKTOP_SESSION

Ortam değişkenini sorgulayarak öğrenebileceğinizi düşünüyorum $DESKTOP_SESSION. Bunun ne kadar desteklendiği konusunda tamamen olumlu değilim, ancak sınırlı testimde Fedora ve Ubuntu'da mevcut gibi görünüyor.

$ echo $DESKTOP_SESSION
gnome

Başka bir seçenek $XDG_SESSION_DESKTOPdeğişkendir.

Yöntem # 2 - wmctrl

Ayrıca bu yöntemi kullanan da var wmctrl.

$ wmctrl  -m
Name: GNOME Shell
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A

Referanslar


1
@ on4aa - $GDMSESSIONbeni sadece GDM ya da GNOME tabanlı DE kullanan DE'ye yönelik olması nedeniyle endişelendiriyor . GDM = GNOME Ekran Yöneticisi.
slm

1
@ on4aa DESKTOP_SESSION, xfce'de .
Graeme

1
xfce'da DESKTOP_SESSION'ım default(nane 15)
glenn jackman

1
Debian da bunun için gösterdi default. Varsayılan GNOME 3 kurulumu.
slm

1
$DESKTOP_SESSIONdefault20 altında KDE için gösterir
Matthew Cline

5

Bu bash betiğini kullanabilirsiniz . Masaüstü ortam adını ve sürümünü algılayabilir.

#!/bin/bash

function detect_gnome()
{
    ps -e | grep -E '^.* gnome-session$' > /dev/null
    if [ $? -ne 0 ];
    then
    return 0
    fi
    VERSION=`gnome-session --version | awk '{print $2}'`
    DESKTOP="GNOME"
    return 1
}

function detect_kde()
{
    ps -e | grep -E '^.* kded4$' > /dev/null
    if [ $? -ne 0 ];
    then
        return 0
    else    
        VERSION=`kded4 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'`
        DESKTOP="KDE"
        return 1
    fi
}

function detect_unity()
{
    ps -e | grep -E 'unity-panel' > /dev/null
    if [ $? -ne 0 ];
    then
    return 0
    fi
    VERSION=`unity --version | awk '{print $2}'`
    DESKTOP="UNITY"
    return 1
}

function detect_xfce()
{
    ps -e | grep -E '^.* xfce4-session$' > /dev/null
    if [ $? -ne 0 ];
    then
    return 0
    fi
    VERSION=`xfce4-session --version | grep xfce4-session | awk '{print $2}'`
    DESKTOP="XFCE"
    return 1
}

function detect_cinnamon()
{
    ps -e | grep -E '^.* cinnamon$' > /dev/null
    if [ $? -ne 0 ];
    then
    return 0
    fi
    VERSION=`cinnamon --version | awk '{print $2}'`
    DESKTOP="CINNAMON"
    return 1
}

function detect_mate()
{
    ps -e | grep -E '^.* mate-panel$' > /dev/null
    if [ $? -ne 0 ];
    then
    return 0
    fi
    VERSION=`mate-about --version | awk '{print $4}'`
    DESKTOP="MATE"
    return 1
}

function detect_lxde()
{
    ps -e | grep -E '^.* lxsession$' > /dev/null
    if [ $? -ne 0 ];
    then
    return 0
    fi

    # We can detect LXDE version only thru package manager
    which apt-cache > /dev/null 2> /dev/null
    if [ $? -ne 0 ];
    then
    which yum > /dev/null 2> /dev/null
    if [ $? -ne 0 ];
    then
        VERSION='UNKNOWN'
    else
        # For Fedora
        VERSION=`yum list lxde-common | grep lxde-common | awk '{print $2}' | awk -F '-' '{print $1}'`
    fi
    else    
    # For Lubuntu and Knoppix
    VERSION=`apt-cache show lxde-common /| grep 'Version:' | awk '{print $2}' | awk -F '-' '{print $1}'`
    fi
    DESKTOP="LXDE"
    return 1
}

function detect_sugar()
{
    if [ "$DESKTOP_SESSION" == "sugar" ];
    then
    VERSION=`python -c "from jarabe import config; print config.version"`
    DESKTOP="SUGAR"
    else
    return 0
    fi
}


DESKTOP="UNKNOWN"
if detect_unity;
then
    if detect_kde;
    then
    if detect_gnome;
    then
        if detect_xfce;
        then
        if detect_cinnamon;
        then
            if detect_mate;
            then
            if detect_lxde;
            then
                detect_sugar
            fi
            fi
        fi
        fi
    fi
    fi
fi


if [ "$1" == '-v' ];
then
    echo $VERSION
else
    if [ "$1" == '-n' ];
    then
    echo $DESKTOP
    else
    echo $DESKTOP $VERSION
    fi
fi

Arch Linux'ta Çalışıyor
Colin Keenan

Senaryomda sadece Xfce olup olmadığını kontrol etme fikrinizi çaldım:ps -e | grep -E '^.* xfce4-session$' > /dev/null (($? == 0)) && ...
Colin Keenan

1
Bu benim için işe yaramadı GNOME Shell 3.26.2aldım UNKNOWN. Hayır çıkış gnome-session --versionbenim için çalışıyor gnome-shell --version | awk '{print $3}'ben de dışında bir şey alamadım ps -e | grep -E '^.* gnome-session$'. Bunun -bsonunda olduğu gibi görünüyor gnome-session-b. $İşleri kaldırmak ya da sadece basitçe ps -e | grep 'gnome-session'. Bu değişikliklerle birlikte senaryo çalışıyor. AnladımGNOME 3.26.2
nath

1

Bu muhtemelen duruma bağlı. Hangi ekran yöneticisinin kullanıldığını biliyorsanız, bunun bilgiyi bir ortam değişkenine koyması olabilir.

Durum böyle değilse tanımlamak istediğiniz her DE'yi kontrol etmeniz gerekir. Hepsi kendi çevre değişkenlerini tanıtmalı.


echo ${DESKTOP_SESSION:0:1}Hile yapıp yapmayacağını merak ediyorum. Test edebildiğim kadarıyla uUnity ve xXFCE için geri döndü . Umarım bazı halk KDE ve diğer masaüstleri için chime olacaktır.
Serge Stroobandt

1
@ on4aa KDE'm echo ${DESKTOP_SESSION} kde-plasma-safeiçin. Neden "güvenli" ...
Hauke ​​Laging

Burada bazı Linux Mint Mate / Tarçın kullanıcıları var mı? E17, LXDE, vb. De açığız ...
Serge Stroobandt


1

Çalışan Xorgişlemleri arayabilirsin. Bunun ebeveyni, ekran yöneticiniz olmalıdır. Torunları, hangi masaüstü ortamının çalıştığını göstermelidir. Sistemimde ekran yöneticisi kendisi yürütür (farklı parametrelerle). Bu daha sonra x-session-managerbirbirine bağlanmış olarak ortaya çıkar xfce4-session. Bu yeterli olabilir, ancak bunun tüm çocukları masaüstü ortamımla ilgili. Bunları işlem ağacı aracılığıyla bulmak, çeşitli programlar tarafından (veya belki de kasıtlı) başlatılan diğer pencere sistemlerinin öğelerini dışlamanın en iyi yolu olmalıdır.

İlk düşüncem, masaüstü ortamınızla ilişkili pencere yöneticisini aramanın en iyisi olacağıydı, ancak genellikle farklı bir tane çalışacak şekilde yapılandırılabilir (örn xmonad. Gnome'da), bu nedenle bu sağlam değildir. Aramak için en iyisi muhtemelen asıl masaüstünü yönetendir, örneğin xfdesktopya da betiğinizin çalışması için gerçekten ihtiyaç duyduğunuz masaüstü ortamının hangi öğesi olursa olsun :)

Örnek

Burada procps-ng kullanarak bir örnek ( -Cve --ppidPOSIX değil). Bunun sadece bir örneği olduğunu varsayar Xorg.

Bu sadece xfce masaüstünde çalışan bir örnektir. Tam çalışan bir örnek, her bir masaüstü sisteminin kullandığı süreçlerle ilgili araştırma yapılmasını gerektirir; diğer çözümlerin çoğu, çevresel değişkenlerin çeşitli diğer masaüstü sistemlerinde nasıl ayarlandığının araştırılmasını gerektirir.

X=Xorg

search_descendants ()
{
  ps h -o comm --ppid $1 |
    grep -E '^(xfdesktop|another_desktop_process)$' &&
    return 0

  for pid in $(ps h -o pid --ppid $1)
  do
    search_descendants $pid && return 0
  done

  return 1
}

dm_pid=$(ps h -o ppid -C "$X")

case "$(search_descendants $dm_pid)" in
  xfdesktop)
    desktop=xfce
    ;;
  another_desktop_process)
    desktop=another_desktop
    ;;
  *)
    desktop=unknown
    ;;
esac

echo $desktop

Bu unknownUbuntu’da döner .
Serge Stroobandt

@ on4aa, bunun tam bir çözüm olması anlamına gelmedi. Bunun xfce masaüstünde çalışan bir örnek olması gerekiyordu. Tam çalışan bir örnek, her masaüstü sisteminin kullandığı süreçlerle ilgili araştırma gerektirir. Bunun kodu okumanın açık olacağını düşünmüştüm .
Graeme

@Greame Haklısın; Biraz hızlıydım ve bitmemiş another_desktopsonucu görmezden geldim .
Serge Stroobandt

1

Çok sayıda yorumda bildirilen tüm deneylerden, fikir birliği cevabı bulmak için OP olarak benim görevim olduğunu düşünüyorum. (Dinlenin, zıt veriler mevcut olduğunda bu cevabı incelemekten memnuniyet duyarım.)

Şimdilik, $XDG_CURRENT_DESKTOPbu değişken tanımlandığında liderliğimizi almak en iyisidir . Aksi halde, $XDG_DATA_DIRSistenen bilgiyi, ilk harfinden daha fazla sağlayabilir ${DESKTOP_SESSION:0:1}.


Hiç var XDG_CURRENT_DESKTOP. Sanırım bunlarla ilgili temel sorun, masaüstü ortamı yerine ekran yöneticisi tarafından ayarlanan değişkenler ve bu yüzden bazı tutarsızlıklar var. Ben lightdm ile varsayılan bir oturumu (xfce) seçtiğinizde echo $DESKTOP_SESSIONveren lightdm-xsessionbir birleşmesi olan lightdmve x-session-manager, (sembolik olarak benim masaüstü başlatmak için kullanılan proses xfce4-session). Farklı bir varsayılan oturumu kurmanın sadece farklı bir sembol bağlantısı kullanıp aynı şeyi vereceğini hayal ediyorumDESKTOP_SESSION
Graeme

Özellikle ekran yöneticisinden XFCE veya Gnome seçerseniz Özellikle, DESKTOP_SESSIONaslında diyecekler xfceyagnome
Graeme

1
Bu çözüm hala Debian merkezli dağıtımlara yönelmektedir. Tartışılan yöntemlerin hiçbiri erişime sahip olduğum Red Hat bazlı dağıtımların hiçbiri üzerinde çalışmamaktadır (Fedora, CentOS, vb.).
slm

1

Bu, hem Ubuntu 18.10 (kozmik) [lxqt tipi] hem de Nane 19 (tara) [tarçın tipi] üzerinde çalışır:

$  set | grep XDG_CURRENT_DESKTOP | tr '[:upper:]' '[:lower:]' | cut -d'=' -f2

Sonucu bir değişkende yakalayın ve oradan tanınan herhangi bir türü / tümünü içeren, yetenekli analitik mantık (eğer varsa / sonra harf); ve / veya tanınmayan türler kullanımdayken incelikle işlev görür.


Xubuntu LTS 18.04 ile de çalışır.
Serge Stroobandt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.