bash
どのデスクトップ環境(XFCE、Unity、KDE、LXDE、Mate、Cinnamon、GNOME2、GNOME3、...)が実行されているかを知る必要があるスクリプトを書いています。
どうすればその情報を入手できますか?
xplanet
おり、デスクトップ環境に固有のコマンドでデスクトップの背景を自動的に更新したいと考えています。その問題に対する回答を投稿する場合は、リンクをたどってください。
bash
どのデスクトップ環境(XFCE、Unity、KDE、LXDE、Mate、Cinnamon、GNOME2、GNOME3、...)が実行されているかを知る必要があるスクリプトを書いています。
どうすればその情報を入手できますか?
xplanet
おり、デスクトップ環境に固有のコマンドでデスクトップの背景を自動的に更新したいと考えています。その問題に対する回答を投稿する場合は、リンクをたどってください。
回答:
チェックの主な問題DESKTOP_SESSION
は、デスクトップセッションではなくディスプレイマネージャによって設定され、不整合が生じることです。以下のためにlightdm
Debianの上、値が下のファイルの名前から来ます/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"
apt-file
また、さまざまなデスクトップのインストール先を確認するための優れたツールです。
XDG_DATA_DIRS
存在しない、または有用なものが含まれていないだけですか?
||
スタイル内の各デスクトップに対して彼がやりたいことをやろうとしている方が良いと思います。それでも、この質問は他のSEサイトで尋ねられました、私たちは最良の答えを持っていると思います。
環境変数を調べることで見つけることができると思います$DESKTOP_SESSION
。これがどれほど広くサポートされているかは完全に肯定的ではありませんが、私の限られたテストでは、FedoraとUbuntuで利用できるようです。
$ echo $DESKTOP_SESSION
gnome
別の選択肢は$XDG_SESSION_DESKTOP
変数です。
を利用するこのメソッドもありwmctrl
ます。
$ wmctrl -m
Name: GNOME Shell
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A
$GDMSESSION
GDMまたはGNOMEベースのDEを使用しているDEのみを対象としている可能性が高いため、緊張します。GDM = GNOME Display Manager。
DESKTOP_SESSION
。
default
(ミント15)
default
もこれを示しました。GNOME 3のデフォルトのインストール
$DESKTOP_SESSION
番組default
のFedora 20の下KDE用
この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
ps -e | grep -E '^.* xfce4-session$' > /dev/null
(($? == 0)) && ...
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
それはおそらく状況に依存します。使用されているディスプレイマネージャがわかっている場合、このディスプレイマネージャがこの情報を環境変数に格納している可能性があります。
そうでない場合は、識別できるようにするすべてのDEを確認する必要があると思います。それらはすべて、独自の環境変数を導入する必要があります。
echo ${DESKTOP_SESSION:0:1}
トリックをするかどうか疑問に思っていますか?テストできる限りu
、Unityとx
XFCEに戻ります。うまくいけば、KDEや他のデスクトップの人たちの声が聞こえてくるでしょう。
echo ${DESKTOP_SESSION} kde-plasma-safe
は私のKDE用です。なぜ「安全」...
環境変数XDG_CURRENT_DESKTOP
が利用可能な場合、それが表示されます。
# echo $XDG_CURRENT_DESKTOP
KDE
実行中のXorg
プロセスを探すことができます。この親はディスプレイマネージャーでなければなりません。その子孫は、実行中のデスクトップ環境を示す必要があります。私のシステムでは、ディスプレイマネージャが(異なるパラメータで)自身を実行します。これにより、にx-session-manager
シンボリックリンクされるスポーンが発生しxfce4-session
ます。これで十分かもしれませんが、この子はすべて私のデスクトップ環境に関連しています。プロセスツリーを介してそれらを見つけることが、さまざまなプログラムによって(または意図的に)開始された他のウィンドウシステムの要素を除外する最良の方法です。
私の最初の考えは、デスクトップ環境に関連付けられたウィンドウマネージャーを探すのが最善だと考えましたが、別のウィンドウマネージャーを実行するように構成できるため(たとえばxmonad
Gnomeで)、これは堅牢ではありません。探すのに最適なのは、おそらく実際のデスクトップを管理するものでしょう。たとえば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
unknown
Ubuntuに戻ります。
another_desktop
結果を見落としていました。
多数のコメントで報告されたすべての実験から、コンセンサスの答えを思い付くことがOPとしての私の義務だと思います。(安心してください。対照的なデータが利用可能になったら、この回答を確認させていただきます。)
今のところ、$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
DESKTOP_SESSION
実際に言うだろうxfce
かgnome
これは、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)を介してさらに必要なコードを実行します。および/または認識されないタイプが使用されているときに正常に機能します。