web-dev-qa-db-ja.com

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

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

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

24

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

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

XDG_CURRENT_DESKTOPは適切な選択のように見えますが、現在 XDG標準 にはないため、常に実装されているわけではありません。これについては here を参照してください。この answer は、さまざまなディストリビューション/デスクトップの値を示しています。また、現在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"
11
Graeme

方法#1-$ DESKTOP_SESSION

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

$ echo $DESKTOP_SESSION
gnome

もう1つの選択肢は、$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

参考文献

10
slm

これは 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
5
alexeevdv

これはUbuntu 18.10(cosmic)[lxqtタイプ]とMint 19(tara)[シナモンタイプ]の両方で機能します。

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

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

1
odoncaoa

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

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

1
Hauke Laging

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

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

procps-ng を使用した例を次に示します(-Cおよび--ppidはPOSIXではありません)。これは、Xorgのインスタンスが1つだけであると想定しています。

これは、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
1
Graeme

環境変数XDG_CURRENT_DESKTOPが利用可能です。

# echo $XDG_CURRENT_DESKTOP
KDE
1
Matthew Cline

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

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

1