실행 bash
중인 데스크탑 환경 (XFCE, Unity, KDE, LXDE, Mate, Cinnamon, GNOME2, GNOME3, ...)을 알아야 하는 스크립트를 작성 중입니다.
그 정보를 어떻게 얻을 수 있습니까?
xplanet
을 자동으로 새로 고치 려고합니다. 해당 문제에 대한 답변 을 게시 하려면 링크를 따르십시오.
실행 bash
중인 데스크탑 환경 (XFCE, Unity, KDE, LXDE, Mate, Cinnamon, GNOME2, GNOME3, ...)을 알아야 하는 스크립트를 작성 중입니다.
그 정보를 어떻게 얻을 수 있습니까?
xplanet
을 자동으로 새로 고치 려고합니다. 해당 문제에 대한 답변 을 게시 하려면 링크를 따르십시오.
답변:
확인에 대한 주요 문제점 DESKTOP_SESSION
은 데스크탑 세션이 아닌 디스플레이 관리자에 의해 설정되며 불일치가 발생할 수 있다는 것입니다. 들어 lightdm
데비안에, 값은 아래 파일의 이름에서 온 /usr/share/xsessions/
. DESKTOP_SESSION
로그인시 특정 항목을 선택하면 데스크톱 환경이 반영되지만 lightdm-xsession
항상 기본 세션으로 사용됩니다.
GDMSESSION
또 다른 옵션이지만 비슷한 처지가있는 것 같습니다 ( DESKTOP_SESSION
나와 같은 가치 ).
XDG_CURRENT_DESKTOP
좋은 선택처럼 보이지만 현재 XDG 표준 이 아니므로 항상 구현되지는 않습니다. 이에 대한 논의는 여기 를 참조 하십시오 . 이 답변 은 다른 배포판 / 데스크탑에 대한 값을 보여줍니다. 또한 XFCE에서 현재 사용할 수 없음을 확인할 수도 있습니다.
XDG_CURRENT_DESKTOP
존재하지 않는 것에 대한 합리적인 대체는 시도하는 것 XDG_DATA_DIRS
입니다. 데스크탑 환경의 데이터 파일이 이름이있는 디렉토리에 설치되어 있으면이 방법이 작동합니다. 이것은 모든 배포판 / 데스크톱의 경우가 될 것입니다!
XFCE, KDE 및 Gnome에 대한 다음 (GNU grep 사용) 테스트 :
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 = 그놈 디스플레이 관리자.
DESKTOP_SESSION
xfce의 @ on4aa
default
(민트 15)
default
도 이것을 보여 주었다 . 그놈 3의 기본 설치
$DESKTOP_SESSION
방송 default
페도 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의-잉 ( -C
및 --ppid
POSIX가 없음). 의 인스턴스가 하나 인 것으로 가정합니다 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
우분투에서 돌아옵니다 .
another_desktop
결과를 간과했다 .
수많은 의견에보고 된 모든 실험에서, 나는 OP로서의 의무가 합의 답변을 도출해야한다고 생각한다. (반드시 대조적 인 데이터가 제공 될 경우이 답변을 검토해 드리겠습니다.)
현재로서는 $XDG_CURRENT_DESKTOP
이 변수가 정의 될 때 부터 리드를 취하는 것이 가장 좋습니다 . 그렇지 않은 $XDG_DATA_DIRS
경우의 첫 글자보다 원하는 정보를 제공 할 수 있습니다 ${DESKTOP_SESSION:0:1}
.
XDG_CURRENT_DESKTOP
. 이것들의 주요 문제는 변수가 데스크탑 환경이 아닌 디스플레이 관리자에 의해 설정되어있어 약간의 불일치가 있다는 변수입니다. lightdm을 echo $DESKTOP_SESSION
사용 하여 기본 세션 (xfce)을 선택 하면 and lightdm-xsession
의 합병이 lightdm
되고 x-session-manager
데스크톱을 시작하는 데 사용되는 프로세스 (로 표시됨 xfce4-session
)가 제공됩니다. 다른 기본 세션으로 설치하면 다른 심볼릭 링크를 사용하고 동일한 결과를 얻을 수 있습니다.DESKTOP_SESSION
DESKTOP_SESSION
실제로 말할 것이다 xfce
또는gnome
이것은 우분투 18.10 (cosmic) [lxqt type]과 Mint 19 (tara) [cinnamon type] 모두에서 작동합니다.
$ set | grep XDG_CURRENT_DESKTOP | tr '[:upper:]' '[:lower:]' | cut -d'=' -f2
결과를 변수로 캡처하고 인식 가능한 모든 유형을 포함하는 가능한 분석 논리 (case stmt, if / then)를 통해 필요한 코드를 추가로 실행합니다. 인식 할 수없는 형식을 사용하는 경우 정상적으로 작동합니다.