বাশ স্ক্রিপ্টে ডেস্কটপ পরিবেশ কীভাবে সনাক্ত করবেন?


24

আমি একটি bashস্ক্রিপ্ট লিখছি যা জানা দরকার যে কোন ডেস্কটপ এনভায়রনমেন্ট (এক্সএফসিই, ইউনিটি, কে, কে, এলএক্সডিই, মেট, দারচিনি, জিনোম 2, জিনোম 3, ...) চলছে।

আমি কীভাবে এই তথ্য পেতে পারি?


1
এটি কঠিন কারণ আপনি যদি কোনও জিনোম অধিবেশনে বসে থাকেন এবং স্রেফ কে-রাইটের মতো একটি কে.ডি. প্রোগ্রাম শুরু করেন, তবে কে-ডি-ই-ডি-ইমন সমস্ত কে-ডি-ই অবকাঠামো চলবে will
থারস্টন স্টার্ক

3
আপনি নির্ভরযোগ্যভাবে না পারেন। আপনি কি জানেন কেন প্রয়োজন? এটি একটি এক্সওয়াই সমস্যার মতো দেখাচ্ছে ।
গিলস 23'40-

@ গিলস ভাল প্রশ্ন। আমি এর জন্য একটি বিশেষ স্ক্রিপ্ট লিখছি xplanetএবং ডেস্কটপ পরিবেশের জন্য নির্দিষ্ট কমান্ডগুলির সাথে ডেস্কটপ ব্যাকগ্রাউন্ডটি স্বয়ংক্রিয়ভাবে রিফ্রেশ করতে চাই । আপনি যদি এই সমস্যার উত্তর পোস্ট করতে চান তবে দয়া করে লিঙ্কটি অনুসরণ করুন।
সার্জ Stroobandt

উত্তর:


11

DESKTOP_SESSIONএটি যাচাইয়ের মূল সমস্যাটি হ'ল এটি ডেস্কটপ সেশনের চেয়ে ডিসপ্লে ম্যানেজার দ্বারা সেট করা এবং অসঙ্গতিগুলির বিষয়। জন্য lightdmডেবিয়ান উপর, মান অধীনে ফাইলের নাম থেকে আসা /usr/share/xsessions/DESKTOP_SESSIONলগ-ইন করার সময় যদি একটি নির্দিষ্ট নির্বাচন করা হয় তবে ডেস্কটপ পরিবেশকে প্রতিফলিত করে তবে lightdm-xsessionসর্বদা ডিফল্ট সেশনটি ব্যবহৃত হয়।

GDMSESSIONঅন্য একটি বিকল্প, তবে এটি একই রকম দুর্দশা বলে মনে হচ্ছে (এটি DESKTOP_SESSIONআমার জন্য একই মান )।

XDG_CURRENT_DESKTOPদেখতে একটি দুর্দান্ত পছন্দ বলে মনে হচ্ছে, তবে এটি বর্তমানে এক্সডিজি স্ট্যান্ডার্ডে নেই এবং এভাবে সর্বদা বাস্তবায়িত হয় না। এটির একটি আলোচনার জন্য এখানে দেখুন । এই উত্তরটি বিভিন্ন ডিস্ট্রো / ডেস্কটপগুলির জন্য এর মানগুলি দেখায়, আমি এটিও নিশ্চিত করতে পারি যে এটি বর্তমানে এক্সএফসিই-তে আমার জন্য উপলভ্য নয়।

XDG_CURRENT_DESKTOPবিদ্যমান না থাকার জন্য যুক্তিসঙ্গত ফলব্যাক চেষ্টা করা হবে XDG_DATA_DIRS। প্রদত্ত ডেস্কটপ পরিবেশের জন্য ডেটা ফাইলগুলির নামের একটি ডিরেক্টরিতে ইনস্টল করা আছে, এই পদ্ধতির কাজ করা উচিত। আশা করা যায় যে সমস্ত ডিস্ট্রো / ডেস্কটপগুলির ক্ষেত্রে এটি ঘটবে!

এক্সএফসিইসি, কেডিএ এবং জিনোমের জন্য নিম্নলিখিত (জিএনইউ গ্রেপ সহ) পরীক্ষা:

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

পসিক্স সামঞ্জস্যপূর্ণ:

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"

আমি এই পছন্দ। এই সংক্ষিপ্ত বিবরণ অনুসারে , কেবল দারুচিনিতে সমস্যা হবে। যাইহোক, লিনাক্স মিন্টের সাথে বাগ রিপোর্ট খোলার মাধ্যমে এটি শেষ পর্যন্ত সমাধান হতে পারে।
সার্জ Stroobandt

@ on4aa মেট তালিকায় নেই, এটি একই সমস্যা হওয়ার সম্ভাবনা রয়েছে। apt-fileবিভিন্ন ডেস্কটপগুলি কোথায় ইনস্টল হয়েছে তা দেখার একটি ভাল সরঞ্জাম।
গ্রামীণ

1
এই সমাধানটি এখনও ডেবিয়ান ভিত্তিক ডিস্ট্রোসের দিকে বেশি ঝুঁকছে। আমার যে রেড হ্যাট ভিত্তিক ডিস্ট্রোগুলিতে অ্যাক্সেস রয়েছে সেগুলির কোনওটিই আলোচিত নয় (ফেডোরা, সেন্টোস ইত্যাদি)।
SLM

@ এসএলএম আকর্ষণীয়, এর XDG_DATA_DIRSঅস্তিত্ব নেই বা এটিতে দরকারী কিছু রয়েছে না?
গ্রামীণ

1
@ এসএলএম খুব সত্য, আমি মনে করি ওপি সম্ভবত প্রতিটি ||স্টাইলের জন্য ডেস্কটপের জন্য যা করতে চান তা করার চেষ্টা করছেন better এখনও অন্যান্য এসই সাইটে এই প্রশ্ন জিজ্ঞাসা করা হয়েছে, আমি মনে করি আমাদের কাছে উত্তরের সেরা সেট রয়েছে।
গ্রামীণ

10

পদ্ধতি # 1 - ES 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
@ অন 4aa - $GDMSESSIONআমাকে ঘাবড়ে যায় কারণ সম্ভবত এটি কেবলমাত্র ডিই এর দিকে এগিয়ে যায় যা জিডিএম বা জিনোম ভিত্তিক ডিই ব্যবহার করছে। জিডিএম = জিনোম ডিসপ্লে ম্যানেজার।
slm

1
@ on4aa DESKTOP_SESSIONxfce এ।
গ্রামীণ

1
এক্সএফসি-তে, আমার ডেস্কটপ_সেসিশনটি default(পুদিনা 15)
গ্লেন জ্যাকম্যান

1
দেবিয়ান এটির defaultজন্যও দেখিয়েছিল । জিনোম ৩. এর একটি ডিফল্ট ইনস্টল
স্ল্যাম

1
$DESKTOP_SESSIONdefaultফেডোরা 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

আর্ক লিনাক্সে কাজ করে
কলিন কেইনন

আমি আমার স্ক্রিপ্টে কেবল এক্সফেসের জন্য যাচাই করার জন্য আপনার ধারণাটি চুরি করেছি: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ইউনিটির xজন্য এবং এক্সএফসিইএস এর জন্য ফিরে আসে । আশা করি কিছু লোক লোক কেডিএ এবং অন্যান্য ডেস্কটপগুলির জন্য চিমে প্রবেশ করবে।
সার্জ স্ট্রোব্যা্যান্ড্ট

1
@ on4aa এটি echo ${DESKTOP_SESSION} kde-plasma-safeআমার কেডিএর জন্য। যাই হোক না কেন "নিরাপদ" ...
হউক লেগেছে

এখানে কি কিছু লিনাক্স মিন্ট মেট / দারুচিনি ব্যবহারকারী রয়েছে? E17, LXDE, ইত্যাদিও স্বাগত ...
সার্জ স্ট্রোব্যান্ড 18

1

যদি পরিবেশগত পরিবর্তনশীল XDG_CURRENT_DESKTOPউপলভ্য থাকে তবে এটি আপনাকে বলা উচিত।

# echo $XDG_CURRENT_DESKTOP
KDE

1
আশ্চর্য হওয়ার কিছু নেই তবে অন্যরাও জানেন যে এই প্রশ্নোত্তরটি পাস: জিনোম ডি-তে নেই।
slm

প্রকৃতপক্ষে, "যদি পাওয়া যায়" জোর দিয়ে। এই আসসুবুন্টু উত্তরটিও দেখুন ।
সার্জ স্ট্রোব্যান্ড

1

আপনি চলমান Xorgপ্রক্রিয়াগুলির জন্য সন্ধান করতে পারেন । এর পিতামাতার আপনার ডিসপ্লে ম্যানেজার হওয়া উচিত। এর বংশধরদের ডেস্কটপ পরিবেশ কী চলছে তা একটি ইঙ্গিত দেওয়া উচিত। আমার সিস্টেমে ডিসপ্লে ম্যানেজার নিজেই চালিত করে (বিভিন্ন পরামিতি সহ)। এই তারপর spawns x-session-managerযা সিমলিঙ্ক হয় xfce4-session। এটি যথেষ্ট হতে পারে তবে এর সমস্ত শিশুরা আমার ডেস্কটপ পরিবেশের সাথে সম্পর্কিত। বিভিন্ন প্রোগ্রাম দ্বারা (বা সম্ভবত ইচ্ছাকৃতভাবে) শুরু হওয়া অন্যান্য উইন্ডো সিস্টেমের উপাদানগুলি বাদ দেওয়ার প্রক্রিয়া গাছের মাধ্যমে তাদের সন্ধান করা ভাল উপায় should

আমার প্রথম ধারণাটি ছিল যে আপনার ডেস্কটপ পরিবেশের সাথে যুক্ত উইন্ডো ম্যানেজারটি সন্ধান করা ভাল হবে তবে প্রায়শই একটি আলাদা চালানোর জন্য কনফিগার করা যেতে পারে (যেমন xmonadজিনোমে) সুতরাং এটি দৃust় নয়। সন্ধানের জন্য সর্বাধিক সেরাটি সম্ভবত হ'ল প্রকৃত ডেস্কটপ পরিচালনা করে, উদাহরণস্বরূপ xfdesktopবা ডেস্কটপ পরিবেশের যে কোনও উপাদানটি আপনার স্ক্রিপ্টটির জন্য কার্যত প্রয়োজন যা প্রয়োজন :)

উদাহরণ

এখানে প্রোম্পস-এনজি ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে ( -Cএবং --ppidপসিক্স নয়)। এটি ধরে নেয় কেবলমাত্র একটি উদাহরণ 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 ডেস্কটপের জন্য কাজ করে এমন একটি উদাহরণ হওয়ার কথা ছিল। প্রতিটি কার্যনির্বাহী উদাহরণের জন্য প্রতিটি ডেস্কটপ সিস্টেম ব্যবহার করে এমন প্রক্রিয়াগুলির তদন্ত প্রয়োজন। আমি ভেবেছিলাম যে থেকে সুস্পষ্ট হয়ে যেত পড়ার কোড।
গ্রামীণ

@ গ্র্যাম আপনি ঠিক বলেছেন; আমি কিছুটা দ্রুত ছিলাম এবং অসম্পূর্ণ another_desktopফলাফলটিকে উপেক্ষা করেছিলাম ।
সার্জ স্ট্রোব্যান্ড

1

অসংখ্য মন্তব্যে রিপোর্ট করা সমস্ত পরীক্ষাগুলি থেকে আমি মনে করি যে OPক্যমতের উত্তর নিয়ে আসা ওপি হিসাবে আমার দায়িত্ব। (নিশ্চিত আশ্বাস, বিপরীতে থাকা ডেটা উপলভ্য হওয়া উচিত আমি এই উত্তরটি পর্যালোচনা করে খুশি হব))

আপাতত, $XDG_CURRENT_DESKTOPযখন এই পরিবর্তনশীলটি সংজ্ঞায়িত করা হয় তখন থেকে আমাদের নেতৃত্ব নেওয়া ভাল । যদি তা না হয় $XDG_DATA_DIRSতবে প্রথম অক্ষরের চেয়ে কাঙ্ক্ষিত তথ্য সরবরাহ করতে পারে ${DESKTOP_SESSION:0:1}


আমার নেই XDG_CURRENT_DESKTOP। আমি মনে করি এগুলির মূল সমস্যাটি ভেরিয়েবলগুলির মধ্যে এগুলি ডেস্কটপ পরিবেশের চেয়ে ডিসপ্লে ম্যানেজার দ্বারা সেট করা থাকে এবং তাই কিছুটা অসঙ্গতি রয়েছে। আমি যখন লাইটডিএম সহ একটি ডিফল্ট সেশন (xfce) নির্বাচন করি যা echo $DESKTOP_SESSIONদেয় lightdm-xsessionযা একটি সংমিশ্রণ lightdmএবং x-session-manager, আমার ডেস্কটপটি শুরু করার জন্য ব্যবহৃত প্রক্রিয়াটি (সিমলিঙ্কযুক্ত xfce4-session)। আমি কল্পনা করেছি যে অন্য কোনও ডিফল্ট সেশনের সাথে ইনস্টল করা কেবল একটি পৃথক সিমলিংক ব্যবহার করবে এবং DESKTOP_SESSION
গ্রীম

উল্লেখযোগ্যভাবে, আমি যদি বিশেষভাবে ডিসপ্লে ম্যানেজারের কাছ থেকে এক্সএফসিই বা জিনোম বেছে নিই, তবে DESKTOP_SESSIONআসলেই বলব xfceবাgnome
গ্রিম

1
এই সমাধানটি এখনও ডেবিয়ান ভিত্তিক ডিস্ট্রোসের দিকে বেশি ঝুঁকছে। আমার যে রেড হ্যাট ভিত্তিক ডিস্ট্রোগুলিতে অ্যাক্সেস রয়েছে সেগুলির কোনওটিই আলোচিত নয় (ফেডোরা, সেন্টোস ইত্যাদি)।
slm

1

এটি উবুন্টু 18.10 (মহাজাগতিক) [lxqt টাইপ] এবং পুদিনা 19 (তারা) [দারুচিনি টাইপ] উভয় ক্ষেত্রেই কাজ করে:

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

কোনও পরিবর্তনকে ফলাফল ক্যাপচার করুন এবং সক্ষম বিশ্লেষণাত্মক যুক্তি (কেস স্টেম্ট, যদি / তারপরে) এর মাধ্যমে আরও প্রয়োজনীয় কোড কার্যকর করুন যা সেখান থেকে যে কোনও / সমস্ত স্বীকৃত প্রকার অন্তর্ভুক্ত করে; এবং / অথবা অজ্ঞাতনামা ধরণের ব্যবহারের সময় মনোযোগ দিয়ে কাজ করুন function


জুবুন্টু এলটিএস 18.04 এর সাথেও কাজ করে।
সার্জ Stroobandt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.