どのデスクトップ環境(XFCE、Unity、KDE、LXDE、Mate、Cinnamon、GNOME2、GNOME3、...)が実行されているかを知る必要があるbash
スクリプトを書いています。
どうすればその情報を入手できますか?
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"
環境変数$DESKTOP_SESSION
を調べればわかると思います。これがどれほど広くサポートされているかは完全に肯定的ではありませんが、私の限られたテストでは、FedoraとUbuntuで利用できるようです。
$ echo $DESKTOP_SESSION
gnome
もう1つの選択肢は、$XDG_SESSION_DESKTOP
変数です。
wmctrl
を利用するこのメソッドもあります。
$ wmctrl -m
Name: GNOME Shell
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A
これは 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
これはUbuntu 18.10(cosmic)[lxqtタイプ]とMint 19(tara)[シナモンタイプ]の両方で機能します。
$ set | grep XDG_CURRENT_DESKTOP | tr '[:upper:]' '[:lower:]' | cut -d'=' -f2
結果を変数に取り込み、そこから認識されるすべての型を含む、可能な分析ロジック(ケースstmt、if/then)を介してさらに必要なコードを実行します。および/または認識されないタイプが使用されているときに正常に機能します。
それはおそらく状況に依存します。使用されているディスプレイマネージャーがわかっている場合は、この情報が環境変数にこの情報を格納している可能性があります。
そうでない場合は、識別できるようにするすべてのDEを確認する必要があります。それらのすべてが独自の環境変数を導入する必要があります。
実行中の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
環境変数XDG_CURRENT_DESKTOP
が利用可能です。
# echo $XDG_CURRENT_DESKTOP
KDE
多数のコメントで報告されたすべての実験から、コンセンサスの答えを出すことはOPとしての私の義務だと思います。 (安心してください。対照的なデータが利用可能になった場合は、この回答を確認させていただきます。)
今のところ、この変数が定義されているときは、$XDG_CURRENT_DESKTOP
からリードをとるのが最善のようです。そうでない場合、$XDG_DATA_DIRS
は${DESKTOP_SESSION:0:1}
の最初の文字よりも多くの情報を提供する場合があります。