bash 스크립트에서 데스크탑 환경을 감지하는 방법은 무엇입니까?


24

실행 bash중인 데스크탑 환경 (XFCE, Unity, KDE, LXDE, Mate, Cinnamon, GNOME2, GNOME3, ...)을 알아야 하는 스크립트를 작성 중입니다.

그 정보를 어떻게 얻을 수 있습니까?


1
그놈 세션에 있고 kDE와 같은 KDE 프로그램을 시작하더라도 KDE 데몬 및 kdeinit와 같은 모든 KDE 인프라가 실행되기 때문에 어렵습니다.
Thorsten Staerk

3
당신은 믿을 수 없을 정도로 할 수 없습니다. 왜 알아야합니까? 이것은 XY 문제 처럼 보입니다 .
Gilles 'SO- 악마 그만'

@Gills 좋은 질문입니다. 특수 스크립트를 작성 중이며 데스크탑 환경에 특정한 명령으로 데스크탑 배경xplanet자동으로 새로 고치 려고합니다. 해당 문제에 대한 답변게시 하려면 링크를 따르십시오.
Stroobandt Serge

답변:


11

확인에 대한 주요 문제점 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"

나는 이것을 좋아한다. 이 개요 에 따르면 Cinnamon에만 문제가 있습니다. 그러나 이것은 Linux Mint로 버그 보고서를 열어서 해결 될 수 있습니다.
Sroo Stroobandt

@ on4aa MATE이 (가) 목록에 없습니다. 동일한 문제가있을 수 있습니다. apt-file또한 다양한 데스크탑이 어디에 설치되어 있는지 확인할 수있는 좋은 도구입니다.
Graeme

1
이 솔루션은 여전히 ​​데비안 기반 배포판에 크게 의존하고 있습니다. 논의 된 방법 중 어느 것도 내가 액세스 할 수있는 Red Hat 기반 배포판 (Fedora, CentOS 등)에서 작동하지 않습니다.
slm

@slm 흥미 롭 XDG_DATA_DIRS거나 존재 하지 않거나 유용한 것이 포함되어 있지 않습니까?
Graeme

1
@ slm 매우 사실, OP는 아마도 각 데스크탑에 대해 원하는 ||스타일 을 수행하는 것이 좋습니다 . 여전히이 질문은 다른 SE 사이트에서 제기되었지만 최선의 답변이 있다고 생각합니다.
Graeme

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 = 그놈 디스플레이 관리자.
slm

1
DESKTOP_SESSIONxfce의 @ on4aa
Graeme

1
XFCE에, 내 DESKTOP_SESSION은 default(민트 15)
글렌 잭맨

1
데비안 default도 이것을 보여 주었다 . 그놈 3의 기본 설치
slm

1
$DESKTOP_SESSION방송 default페도 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

아치 리눅스에서 작동
Colin Keenan

내 스크립트에서 Xfce를 확인하는 아이디어를 훔쳤습니다.ps -e | grep -E '^.* xfce4-session$' > /dev/null (($? == 0)) && ...
Colin Keenan

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
nath

1

아마도 상황에 따라 다릅니다. 어떤 디스플레이 관리자가 사용되는지 아는 경우이 정보가 환경 변수에 저장 될 수 있습니다.

그렇지 않은 경우 식별 할 수있는 모든 DE를 확인해야한다고 생각합니다. 그들 모두 자신 만의 환경 변수를 도입해야합니다.


echo ${DESKTOP_SESSION:0:1}트릭을 할 것인지 궁금합니다 . 테스트 할 수있는 u한 Unity와 xXFCE로 돌아갑니다 . KDE와 다른 데스크탑을 사용하는 사람들이 있기를 바랍니다.
Stroobandt Serge

1
@ on4aa echo ${DESKTOP_SESSION} kde-plasma-safeKDE를위한 것입니다.

여기에 Linux Mint Mate / Cinnamon 사용자가 있습니까? 등 E17, LXDE는 ... 또한 환영합니다
서지 Stroobandt

1

환경 변수 XDG_CURRENT_DESKTOP를 사용할 수 있으면 알려줍니다.

# echo $XDG_CURRENT_DESKTOP
KDE

1
놀랍지 만 다른 사람들은이 Q & A를 통과한다는 것을 알고 있습니다 : 그놈 DE에는 존재하지 않습니다.
slm

실제로 "사용 가능한 경우"에 중점을 둡니다. 이 Askubuntu 답변 도 참조하십시오 .
Stroobandt Serge

1

실행중인 Xorg프로세스를 찾을 수 있습니다. 이 부모는 디스플레이 관리자 여야합니다. 그 하위 항목은 실행중인 데스크탑 환경을 표시해야합니다. 내 시스템에서 디스플레이 관리자는 다른 매개 변수를 사용하여 자체적으로 실행됩니다. 그런 다음 x-session-manager에 심볼릭 링크가 생성 됩니다 xfce4-session. 이것으로 충분하지만 이것의 모든 자식은 내 데스크탑 환경과 관련이 있습니다. 프로세스 트리를 통해이를 찾는 것이 다양한 프로그램에 의해 시작된 (또는 고의적으로) 다른 윈도우 시스템의 요소를 제외하는 가장 좋은 방법이어야합니다.

내 첫 번째 생각은 데스크탑 환경과 관련된 창 관리자를 찾는 것이 가장 좋지만 종종 다른 환경을 실행하도록 구성 할 수 있다는 것입니다 (예 : xmonadGnome). 가장 좋은 방법은 실제 데스크탑을 관리하는 것입니다. 예를 들어 xfdesktop스크립트를 작동시키는 데 실제로 필요한 데스크탑 환경의 요소는 무엇입니까? :)

여기서 사용하는 예이다 Procps의-잉 ( -C--ppidPOSIX가 없음). 의 인스턴스가 하나 인 것으로 가정합니다 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우분투에서 돌아옵니다 .
Stroobandt Serge

@ on4aa는 완벽한 솔루션이 아닙니다. 이것은 xfce 데스크탑에서 작동하는 예제였습니다. 전체 예제를 보려면 각 데스크탑 시스템이 사용하는 프로세스를 조사해야합니다. 나는 그것이 코드 를 읽는 것에서 명백했을 것이라고 생각했다 .
Graeme

@Greame 당신이 맞습니다; 나는 너무 빨랐고 미완성 된 another_desktop결과를 간과했다 .
Sroo Stroobandt

1

수많은 의견에보고 된 모든 실험에서, 나는 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
Graeme

나는 특히 디스플레이 관리자에서 XFCE 또는 그놈을 선택하면 특히, DESKTOP_SESSION실제로 말할 것이다 xfce또는gnome
그레엄

1
이 솔루션은 여전히 ​​데비안 기반 배포판에 크게 의존하고 있습니다. 논의 된 방법 중 어느 것도 내가 액세스 할 수있는 Red Hat 기반 배포판 (Fedora, CentOS 등)에서 작동하지 않습니다.
slm

1

이것은 우분투 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)를 통해 필요한 코드를 추가로 실행합니다. 인식 할 수없는 형식을 사용하는 경우 정상적으로 작동합니다.


Xubuntu LTS 18.04 와도 호환됩니다.
Sroo Stroobandt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.