कैसे एक बाश स्क्रिप्ट में डेस्कटॉप वातावरण का पता लगाने के लिए?


24

मैं एक bashस्क्रिप्ट लिख रहा हूं, जिसमें यह जानना आवश्यक है कि कौन सा डेस्कटॉप वातावरण (XFCE, यूनिटी, KDE, LXDE, मेट, दालचीनी, GNOME2, GNOME3, ...) चल रहा है।

मैं वह जानकारी कैसे प्राप्त कर सकता हूं?


1
यह कठिन है क्योंकि भले ही आप एक गनोम सत्र में हों और केडीई डेमन और केडिनिट जैसे सभी केडीई बुनियादी ढांचे को लिखने के लिए केडीई जैसे एक केडीई कार्यक्रम शुरू किया हो।
थोरस्टेन स्टाक

3
आप बहुत अधिक नहीं कर सकते, मज़बूती से नहीं। तुम क्यों जानना चाहते हो? यह एक XY समस्या की तरह दिखता है
गिल्स एसओ- बुराई को रोकना '

@ गिल्स अच्छा सवाल। मैं के लिए एक विशेष स्क्रिप्ट लिख रहा हूं xplanetऔर डेस्कटॉप वातावरण के लिए विशेष रूप से कमांड के साथ डेस्कटॉप पृष्ठभूमि को स्वचालित रूप से ताज़ा करना चाहूंगा । यदि आप उस समस्या का उत्तर देना चाहते हैं , तो कृपया लिंक का अनुसरण करें।
सर्ज स्ट्राओबांट

जवाबों:


11

जाँच के साथ मुख्य समस्या DESKTOP_SESSIONयह है कि यह डेस्कटॉप सत्र के बजाय प्रदर्शन प्रबंधक द्वारा निर्धारित किया गया है और विसंगतियों के अधीन है। के लिए lightdmडेबियन पर, मूल्यों के अंतर्गत फ़ाइलें के नाम से आते हैं /usr/share/xsessions/DESKTOP_SESSIONडेस्कटॉप वातावरण को दर्शाता है यदि लॉग में एक विशिष्ट चयन किया जाता है, हालांकि lightdm-xsessionहमेशा डिफ़ॉल्ट सत्र का उपयोग किया जाता है।

GDMSESSIONएक और विकल्प है, लेकिन ऐसा लगता है कि एक समान विधेय है (यह DESKTOP_SESSIONमेरे लिए उतना ही मूल्य है)।

XDG_CURRENT_DESKTOPएक अच्छे विकल्प की तरह दिखता है, हालांकि यह वर्तमान में एक्सडीजी मानक में नहीं है और इस तरह हमेशा लागू नहीं होता है। इसकी चर्चा के लिए यहाँ देखें । यह उत्तर अलग-अलग डिस्ट्रो / डेस्कटॉप के लिए अपने मूल्यों को दिखाता है, मैं यह भी पुष्टि कर सकता हूं कि यह वर्तमान में मेरे लिए एक्सएफसीई पर उपलब्ध नहीं है।

XDG_CURRENT_DESKTOPमौजूदा के लिए उचित वापसी की कोशिश करने के लिए होगा XDG_DATA_DIRS। बशर्ते डेस्कटॉप वातावरण के लिए डेटा फ़ाइलों को एक निर्देशिका में स्थापित किया गया है जिसका नाम असर है, यह दृष्टिकोण काम करना चाहिए। यह उम्मीद है कि सभी distros / डेस्कटॉप के लिए मामला होगा!

XFCE, केडीई और सूक्ति के लिए निम्नलिखित (GNU grep के साथ) परीक्षण:

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

POSIX संगत:

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

जाँच के साथ संयोजन करने के लिए 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"

यह मुझे पंसद है। इस अवलोकन के अनुसार , केवल दालचीनी के साथ एक समस्या होगी। हालाँकि, यह अंततः लिनक्स मिंट के साथ एक बग रिपोर्ट खोलकर हल किया जा सकता है।
सर्ज स्ट्रोबोबांट

@ on4aa MATE सूची में नहीं है, यह एक ही मुद्दा होने की संभावना है। apt-fileयह देखने के लिए भी एक अच्छा उपकरण है कि विभिन्न डेस्कटॉप कहाँ स्थापित होते हैं।
ग्रीम

1
यह समाधान अभी भी डेबियन आधारित डिस्ट्रोस की ओर बहुत अधिक झुक रहा है। Red Hat आधारित डिस्ट्रोस के किसी भी कार्य पर चर्चा की गई विधियों में से कोई भी मेरे पास नहीं है (फेडोरा, सेंटोस, आदि)।
स्लम

@ एसएलएम दिलचस्प है, XDG_DATA_DIRSमौजूद नहीं है या यह सिर्फ उपयोगी कुछ भी नहीं है?
ग्रीम

1
@ बहुत ही सही, मुझे लगता है कि ओपी शायद बेहतर करने की कोशिश कर रहा है जो वह प्रत्येक डेस्कटॉप के लिए एक ||शैली में करना चाहता है । फिर भी अन्य एसई साइटों पर यह सवाल पूछा गया है, मुझे लगता है कि हमारे पास उत्तर का सबसे अच्छा सेट है।
ग्रीम

10

विधि # 1 - $ DESKTOP_SESSION

मुझे लगता है कि आप पर्यावरण चर से पूछताछ करके पता लगा सकते हैं $DESKTOP_SESSION। मैं पूरी तरह से सकारात्मक नहीं हूं कि यह कितना व्यापक रूप से समर्थित है लेकिन मेरे सीमित परीक्षण में यह फेडोरा और उबंटू पर उपलब्ध है।

$ echo $DESKTOP_SESSION
gnome

एक अन्य विकल्प $XDG_SESSION_DESKTOPचर है।

विधि # 2 - wmctrl

इस पद्धति का भी उपयोग किया जाता है wmctrl

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

संदर्भ


1
@ on4aa - $GDMSESSIONइससे मुझे घबराहट होती है क्योंकि इसकी संभावना केवल DE की ओर है जो GDM या GNOME आधारित DE का उपयोग कर रहे हैं। GDM = GNOME प्रदर्शन प्रबंधक।
स्लम

1
@ on4aa DESKTOP_SESSIONon xfce।
ग्रीम

1
Xfce पर, मेरा DESKTOP_SESSION है default(टकसाल 15)
ग्लेन जैकमैन

1
इसके लिए डेबियन ने defaultभी दिखाया । एक डिफ़ॉल्ट 3. सूक्ति की स्थापित
SLM

1
$DESKTOP_SESSIONशो defaultफेडोरा 20 के तहत केडीई के लिए
मैथ्यू क्लाइन

5

आप इस बैश स्क्रिप्ट का उपयोग कर सकते हैं । यह डेस्कटॉप पर्यावरण नाम और संस्करण का पता लगा सकता है।

#!/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

आर्क लिनक्स पर काम करता है
कॉलिन कीनन

मैंने आपके विचार को केवल अपनी स्क्रिप्ट में Xfce के लिए जांचने के लिए चुरा लिया है:ps -e | grep -E '^.* xfce4-session$' > /dev/null (($? == 0)) && ...
कॉलिन कीनन

1
यह मेरे लिए मेरे काम नहीं GNOME Shell 3.26.2आया UNKNOWNgnome-session --versionमेरे लिए काम करने से कोई आउटपुट नहीं है , मुझे gnome-shell --version | awk '{print $3}'कुछ भी नहीं मिला ps -e | grep -E '^.* gnome-session$'-bके अंत में ऐसा लगता है gnome-session-b$कामों को हटाना या बस ps -e | grep 'gnome-session'। इस बदलाव के साथ स्क्रिप्ट काम कर रही है। मुझे मिलता हैGNOME 3.26.2
नाथ

1

वह शायद स्थिति पर निर्भर करता है। यदि आप जानते हैं कि कौन से डिस्प्ले मैनेजर का उपयोग किया जाता है, तो हो सकता है कि यह जानकारी पर्यावरण चर में डाल दे।

अगर ऐसा नहीं है तो मुझे लगता है कि आपको हर उस डीई की जांच करनी होगी जिसे आप पहचानने में सक्षम होना चाहते हैं। उन सभी को अपने स्वयं के पर्यावरण चर का परिचय देना चाहिए।


मैं सोच रहा हूं कि क्या echo ${DESKTOP_SESSION:0:1}चाल चलेगी? जहाँ तक मैं परीक्षण कर सकता था, यह uएकता के लिए और xXFCE के लिए वापस आता है । उम्मीद है कि कुछ लोग केडीई और अन्य डेस्कटॉप के लिए झंकार करेंगे।
सर्ज स्ट्रोबोबांट

1
@ on4aa यह echo ${DESKTOP_SESSION} kde-plasma-safeमेरे KDE के लिए है। क्यों "सुरक्षित" ...
हॉक लाजिंग

क्या यहां कुछ लिनक्स मिंट मेट / दालचीनी उपयोगकर्ता हैं? E17, LXDE, आदि का भी स्वागत है ...
सर्ज स्ट्रोबोबांट

1

यदि पर्यावरण चर XDG_CURRENT_DESKTOPउपलब्ध है, तो यह आपको बताना चाहिए।

# echo $XDG_CURRENT_DESKTOP
KDE

1
आश्चर्य की बात नहीं है, लेकिन सिर्फ अन्य लोगों को पता है कि इस प्रश्नोत्तर द्वारा पारित: गनोम डे में मौजूद नहीं है।
SLM

वास्तव में, "यदि उपलब्ध हो" पर जोर देने के साथ। यह भी पूछो Askubuntu उत्तर
सर्ज स्ट्रोब्लांड

1

आप चल रही Xorgप्रक्रियाओं के लिए देख सकते हैं। इस के अभिभावक आपके प्रदर्शन प्रबंधक होने चाहिए। इसके वंशजों को यह संकेत देना चाहिए कि डेस्कटॉप वातावरण क्या चल रहा है। मेरे सिस्टम पर, डिस्प्ले मैनेजर खुद को (विभिन्न मापदंडों के साथ) निष्पादित करता है। इसके बाद x-session-managerस्पॉन्ज किया जाता है, जिस पर सहानुभूति होती है xfce4-session। यह पर्याप्त हो सकता है, लेकिन इसके सभी बच्चे मेरे डेस्कटॉप वातावरण से संबंधित हैं। प्रक्रिया के माध्यम से उन्हें ढूंढना पेड़ को विभिन्न कार्यक्रमों (या शायद जानबूझकर) द्वारा शुरू की गई अन्य खिड़की प्रणालियों के तत्वों को बाहर करने का सबसे अच्छा तरीका होना चाहिए।

मेरा पहला विचार यह था कि अपने डेस्कटॉप वातावरण से जुड़े विंडो मैनेजर को देखना सबसे अच्छा होगा, लेकिन अक्सर एक अलग को चलाने के लिए कॉन्फ़िगर किया जा सकता है (उदाहरण xmonadके लिए गनोम) इसलिए यह मजबूत नहीं है। देखने के लिए सबसे अच्छा शायद एक है जो वास्तविक डेस्कटॉप का प्रबंधन करता है, उदाहरण के लिए xfdesktopया डेस्कटॉप वातावरण का जो भी तत्व आपको कार्य करने के लिए आपकी स्क्रिप्ट की आवश्यकता है :)

उदाहरण

यहाँ procps-ng ( -Cऔर --ppidPOSIX नहीं हैं) का उपयोग कर एक उदाहरण दिया गया है । यह मानता है कि केवल एक ही उदाहरण है Xorg

यह सिर्फ एक उदाहरण है जो xfce डेस्कटॉप के लिए काम करता है। एक पूर्ण कामकाजी उदाहरण के लिए प्रक्रियाओं में एक जांच की आवश्यकता होती है जो प्रत्येक डेस्कटॉप सिस्टम का उपयोग करता है, ठीक उसी तरह जैसे कि अन्य समाधानों में से अधिकांश की जांच की आवश्यकता होती है कि पर्यावरण चर विभिन्न अन्य डेस्कटॉप प्रणालियों में कैसे सेट किए जाते हैं।

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

यह unknownउबंटू पर लौटता है।
सर्ज स्ट्राओबांट

@ on4aa, इसका मतलब पूर्ण समाधान नहीं था। यह एक उदाहरण माना जाता था जो xfce डेस्कटॉप के लिए काम करता है। एक पूर्ण कार्य उदाहरण के लिए उन प्रक्रियाओं की जांच की आवश्यकता होती है जो प्रत्येक डेस्कटॉप सिस्टम उपयोग करता है। मुझे लगा कि कोड पढ़ने से स्पष्ट होगा ।
ग्रीम

@Greame तुम सही हो; मैं थोड़ा जल्दी था और अधूरे another_desktopपरिणाम को नजरअंदाज कर दिया ।
सर्ज स्ट्रोबंड

1

कई टिप्पणियों में बताए गए सभी प्रयोग से, मुझे लगता है कि ओपी के रूप में अपना कर्तव्य एक आम सहमति से जवाब देना है। (निश्चिंत रहें, मुझे इस बात की समीक्षा करने में खुशी होगी कि विपरीत डेटा उपलब्ध होना चाहिए।)

अभी के लिए, $XDG_CURRENT_DESKTOPइस चर को परिभाषित करने पर हमारी लीड लेना सबसे अच्छा लगता है। यदि नहीं, $XDG_DATA_DIRSतो वांछित जानकारी प्रदान कर सकते हैं, पहले पत्र की तुलना में अधिक ${DESKTOP_SESSION:0:1}


मेरे पास नहीं है XDG_CURRENT_DESKTOP। मुझे लगता है कि इनके साथ मुख्य समस्या चर है जिसमें वे डेस्कटॉप वातावरण के बजाय प्रदर्शन प्रबंधक द्वारा निर्धारित किए गए हैं और इसलिए कुछ असंगतता है। जब मैं lightdm के साथ एक डिफ़ॉल्ट सत्र (XFCE) का चयन echo $DESKTOP_SESSIONदेता है lightdm-xsessionजो की एक समामेलन lightdmऔर x-session-manager, मेरे डेस्कटॉप (सांकेतिक रूप से लिंक शुरू करने के लिए इस्तेमाल किया प्रक्रिया xfce4-session)। मैं एक अलग डिफ़ॉल्ट सत्र के साथ स्थापित करने की कल्पना करता हूं, बस एक अलग सिमिलिंक का उपयोग करूंगा और समान उपज दूंगाDESKTOP_SESSION
ग्रीम

विशेष रूप से, यदि मैं विशेष रूप से प्रदर्शन प्रबंधक से XFCE या गनोम का चयन करता हूं, तो DESKTOP_SESSIONवास्तव में कहेंगे xfceयाgnome
ग्रीम

1
यह समाधान अभी भी डेबियन आधारित डिस्ट्रोस की ओर बहुत अधिक झुक रहा है। Red Hat आधारित डिस्ट्रोस के किसी भी कार्य पर चर्चा की गई विधियों में से कोई भी मेरे पास नहीं है (फेडोरा, सेंटोस, आदि)।
स्लम

1

यह उबंटू 18.10 (कॉस्मिक) [lxqt प्रकार] और मिंट 19 (तारा) [दालचीनी प्रकार] दोनों पर काम करता है:

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

परिणाम को एक चर में कैद करें, और सक्षम विश्लेषणात्मक तर्क (मामला stmt, यदि / तो) के माध्यम से आगे आवश्यक कोड निष्पादित करें, जिसमें कोई / सभी मान्यता प्राप्त प्रकार शामिल हैं; और / या अनजाने में उपयोग किए जाने पर इनायत से काम करें।


Xubuntu LTS 18.04 के साथ भी काम करता है।
सर्ज स्ट्रोबैंडैंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.