bashスクリプトでデスクトップ環境を検出する方法は?


24

bashどのデスクトップ環境(XFCE、Unity、KDE、LXDE、Mate、Cinnamon、GNOME2、GNOME3、...)が実行されているかを知る必要があるスクリプトを書いています。

どうすればその情報を入手できますか?


1
GNOMEセッションでkwriteのような1つのKDEプログラムを開始しただけでも、KDEデーモンやkdeinitなどのすべてのKDEインフラストラクチャが実行されるため、それは困難です。
トールステンスターク14

3
あなたはほとんどできない、信頼できない。なぜあなたは知る必要があるのですか?これはXY問題のように見えます
ジル「SO-悪であるのをやめる」14

@Gillesいい質問ですね。私は専用のスクリプトを作成してxplanetおり、デスクトップ環境に固有のコマンドでデスクトップの背景自動的に更新したいと考えています。その問題に対する回答投稿する場合は、リンクをたどってください。
セルジュStroobandt 14

回答:


11

チェックの主な問題DESKTOP_SESSIONは、デスクトップセッションではなくディスプレイマネージャによって設定され、不整合が生じることです。以下のためにlightdmDebianの上、値が下のファイルの名前から来ます/usr/share/xsessions/DESKTOP_SESSIONログイン時に特定の選択が行われた場合、デスクトップ環境を反映しますがlightdm-xsession、デフォルトのセッションが常に使用されます。

GDMSESSIONは別のオプションですが、同様の苦境があるようです(DESKTOP_SESSION私と同じ値です)。

XDG_CURRENT_DESKTOP良い選択のように見えますが、現在はXDG標準にはないため、常に実装されているわけではありません。これについての議論はこちらをご覧ください。この回答は、さまざまなディストリビューション/デスクトップの値を示しています。XFCEで現在利用できないことも確認できます。

XDG_CURRENT_DESKTOP存在しないための合理的なフォールバックは、試行することXDG_DATA_DIRSです。デスクトップ環境のデータファイルがその名前の付いたディレクトリにインストールされている場合、このアプローチは機能するはずです。これがすべてのディストリビューション/デスクトップに当てはまることを願っています!

次の(GNU grepを使用した)XFCE、KDE、およびGnomeのテスト:

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"

私はこれが好き。この概要によると、シナモンには問題があるだけです。ただし、これは最終的にLinux Mintでバグレポートを開くことで解決される可能性があります。
セルジュStroobandt 14

@ on4aa MATEはリストにないため、同じ問題が発生する可能性があります。apt-fileまた、さまざまなデスクトップのインストール先を確認するための優れたツールです。
グレアム14

1
このソリューションはまだDebianベースのディストリビューションに大きく傾いています。説明した方法はどれも、私がアクセスできるRed Hatベースのディストリビューション(Fedora、CentOSなど)で機能しません。
slm

@slm興味深い、XDG_DATA_DIRS存在しない、または有用なものが含まれていないだけですか?
グレアム14

1
@slmは非常に真実です。OPはおそらく、||スタイル内の各デスクトップに対して彼がやりたいことをやろうとしている方が良いと思います。それでも、この質問は他のSEサイトで尋ねられました、私たちは最良の答えを持っていると思います。
グレアム14

10

方法#1-$ DESKTOP_SESSION

環境変数を調べることで見つけることができると思います$DESKTOP_SESSION。これがどれほど広くサポートされているかは完全に肯定的ではありませんが、私の限られたテストでは、FedoraとUbuntuで利用できるようです。

$ 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- $GDMSESSIONGDMまたはGNOMEベースのDEを使用しているDEのみを対象としている可能性が高いため、緊張します。GDM = GNOME Display Manager。
slm

1
xfceの@ on4aa DESKTOP_SESSION
グレアム14

1
xfceでは、DESKTOP_SESSIONはdefault(ミント15)
グレンジャックマン14

1
Debian defaultもこれを示しました。GNOME 3のデフォルトのインストール
slm

1
$DESKTOP_SESSION番組defaultのFedora 20の下KDE用
マシュークライン

5

このbashスクリプトを使用できます。デスクトップ環境の名前とバージョンを検出できます。

#!/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で動作する
コリンキーナン14年

私のスクリプトでXfceだけをチェックするというあなたのアイデアを盗みました:ps -e | grep -E '^.* xfce4-session$' > /dev/null (($? == 0)) && ...
Colin Keenan 14年

1
これは私にとってはうまくGNOME Shell 3.26.2いきませんでしたUNKNOWN。以下からの出力gnome-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

それはおそらく状況に依存します。使用されているディスプレイマネージャがわかっている場合、このディスプレイマネージャがこの情報を環境変数に格納している可能性があります。

そうでない場合は、識別できるようにするすべてのDEを確認する必要があると思います。それらはすべて、独自の環境変数を導入する必要があります。


私はecho ${DESKTOP_SESSION:0:1}トリックをするかどうか疑問に思っていますか?テストできる限りu、UnityとxXFCEに戻ります。うまくいけば、KDEや他のデスクトップの人たちの声が聞こえてくるでしょう。
セルジュStroobandt 14

1
@ on4aaそれecho ${DESKTOP_SESSION} kde-plasma-safeは私のKDE用です。なぜ「安全」...
Hauke Laging 14

Linux Mint Mate / Cinnamonユーザーはここにいますか?などE17、LXDEは、...も歓迎
セルジュStroobandt

1

環境変数XDG_CURRENT_DESKTOPが利用可能な場合、それが表示されます。

# echo $XDG_CURRENT_DESKTOP
KDE

1
驚くことではありませんが、このQ&A:に合格することはGNOME DEには存在しないということを他の人も知っています。
slm

実際、「利用可能な場合」に重点を置いています。このAskubuntuの回答も参照してください。
サージストローバンド14

1

実行中のXorgプロセスを探すことができます。この親はディスプレイマネージャーでなければなりません。その子孫は、実行中のデスクトップ環境を示す必要があります。私のシステムでは、ディスプレイマネージャが(異なるパラメータで)自身を実行します。これにより、にx-session-managerシンボリックリンクされるスポーンが発生しxfce4-sessionます。これで十分かもしれませんが、この子はすべて私のデスクトップ環境に関連しています。プロセスツリーを介してそれらを見つけることが、さまざまなプログラムによって(または意図的に)開始された他のウィンドウシステムの要素を除外する最良の方法です。

私の最初の考えは、デスクトップ環境に関連付けられたウィンドウマネージャーを探すのが最善だと考えましたが、別のウィンドウマネージャーを実行するように構成できるため(たとえばxmonadGnomeで)、これは堅牢ではありません。探すのに最適なのは、おそらく実際のデスクトップを管理するものでしょう。たとえばxfdesktop、スクリプトが機能するために実際に必要なデスクトップ環境の要素は何でも:)

次に、procps-ngを使用した例を示します(POSIX -C--ppidはありません)。はのインスタンスが1つだけであると想定しています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

これはunknownUbuntuに戻ります。
セルジュStroobandt 14

@ on4aa、これは完全な解決策ではありませんでした。これは、xfceデスクトップで機能する例と想定されていました。完全に機能する例では、各デスクトップシステムが使用するプロセスを調査する必要があります。それはコードを読むことから明らかだろうと思った。
グレアム14

@Greameあなたは正しい。私は少し速すぎて、未完成のanother_desktop結果を見落としていました。
セルジュStroobandt 14

1

多数のコメントで報告されたすべての実験から、コンセンサスの答えを思い付くことがOPとしての私の義務だと思います。(安心してください。対照的なデータが利用可能になったら、この回答を確認させていただきます。)

今のところ、$XDG_CURRENT_DESKTOPこの変数が定義されているときから先導するのが最善のようです。そうでない場合は、$XDG_DATA_DIRSの最初の文字よりも望ましい情報を提供できます${DESKTOP_SESSION:0:1}


ありませんXDG_CURRENT_DESKTOP。これらの主な問題は、デスクトップ環境ではなくディスプレイマネージャーによって設定されるため、いくつかの矛盾があるという点で変数だと思います。lightdmでデフォルトのセッション(xfce)を選択すると、との融合であり、デスクトップの起動に使用されるプロセス(にリンク)がecho $DESKTOP_SESSION与えられます。私は別のデフォルトのセッションでインストールを想像することは、単に別のシンボリックリンクを使用し、同じを得られますlightdm-xsessionlightdmx-session-managerxfce4-sessionDESKTOP_SESSION
グレアム・

特に、私は、特にディスプレイマネージャからXFCEやGNOMEを選択した場合、DESKTOP_SESSION実際に言うだろうxfcegnome
グレアム

1
このソリューションはまだDebianベースのディストリビューションに大きく傾いています。説明した方法はどれも、私がアクセスできるRed Hatベースのディストリビューション(Fedora、CentOSなど)で機能しません。
slm

1

これは、Ubuntu 18.10(cosmic)[lxqt type]とMint 19(tara)[cinnamon type]の両方で機能します。

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

結果を変数にキャプチャし、そこから任意の/すべての認識されたタイプを含む有能な分析ロジック(ケースstmt、if / then)を介してさらに必要なコードを実行します。および/または認識されないタイプが使用されているときに正常に機能します。


Xubuntu LTS 18.04でも動作します。
セルジュストローバンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.