Как обнаружить настольную среду в сценарии удара?

Необходимо сказать ld где искать библиотеку, так как это не находится в одном из каталогов по умолчанию. Так как компоновщиком вызывают gcc, используйте последнего -L опция.

gcc -lrtadb -L/usr/local/lib/rta-0.8.1/src

должен сделать это в Вашем случае.

24
23.02.2014, 15:30
9 ответов
[115002] Основная проблема с проверкой [115468]DESKTOP_SESSION [115469] заключается в том, что она устанавливается диспетчером дисплея, а не сеансом работы с настольным компьютером, и подвержена несогласованности. Для [115470]lightdm[115471] в Debian значения приходят из имен файлов в разделе [115472]/usr/share/xsessions/[115473]. [115474]DESKTOP_SESSION[115475] отражает окружение рабочего стола, если при входе в систему сделан определённый выбор, однако [115476]lightdm-xsessions[115477] всегда используется сессия по умолчанию. [12144]GDMSESSION[115479] - еще один вариант, но, похоже, у него похожее затруднительное положение (для меня это то же значение, что и [115480]DESKTOP_SESSION[115481]).[12145]XDG_CURRENT_DESKTOP[115483] выглядит неплохим выбором, Однако в настоящее время он не входит в стандарт [115484]XDG [115485] и поэтому не всегда реализуется. См. [115486] здесь [115487]. Этот [115488] ответ[115489] показывает свои значения для различных дистрибутивов / настольных компьютеров, я также могу подтвердить, что в настоящее время он не доступен для меня на XFCE.[12146] Разумным откатом для [115490] XDG_CURRENT_DESKTOP[115491] не существует было бы попробовать [115492] XDG_DATA_DIRS[115493]. Если файлы данных для среды рабочего стола установлены в каталог с его именем, то такой подход должен работать. Надеемся, что так будет и для всех дистрибутивов/десктопов![12147]Следующие (с GNU grep) тесты для XFCE, KDE и Gnome:[12148]POSIX совместимы:[12149]В сочетании с проверкой [115494]XDG_CURRENT_DESKTOP[115495]:[12150]
11
27.01.2020, 19:41
[113545]Метод #1 - $DESKTOP_SESSION

Думаю, что это можно узнать, опросив переменную окружения [114029]$DESKTOP_SESSION[114030]. Я не совсем уверен, насколько это поддерживается, но в моем ограниченном тестировании это, кажется, доступно на Fedora & Ubuntu.

Другой вариант - переменная [114031]$XDG_SESSION_DESKTOP[114032].

Метод #2 - wmctrl

Также существует этот метод, использующий [114033]wmctrl[114034].

Ссылки

Как определить, какой оконный менеджер работает

10
27.01.2020, 19:41
[112512] Это, наверное, зависит от ситуации. Если вы знаете, какой диспетчер дисплеев используется, то, возможно, он помещает эту информацию в переменную окружения.[12206]Если это не так, то, думаю, вам нужно проверить каждое DE, которое вы хотите иметь возможность идентифицировать. Все они должны ввести свои собственные переменные окружения.[112515]
1
27.01.2020, 19:41
[113687] Если переменная окружающей среды [114167] XDG_CURRENT_DESKTOP[114168] доступна, он должен сказать вам.
  • 1
    27.01.2020, 19:41
    [114803]Из всех экспериментов, о которых сообщалось в многочисленных комментариях, я считаю своим долгом как ФП прийти к консенсусу. (Будьте уверены, я буду рад рассмотреть этот ответ, если станут доступны контрастные данные)

    Пока, кажется, лучше всего взять на себя инициативу от [115236]$XDG_CURRENT_DESKTOP[115237], когда эта переменная будет определена. Если нет, то [115238]$XDG_DATA_DIRS[115239] может предоставить желаемую информацию, больше чем первая буква [115240]${DESKTOP_SESSION:0:1}[115241].[114806].

    1
    27.01.2020, 19:41
    [112591] Можно искать запуск процессов [113155] Xorg[113156]. Родитель должен быть вашим менеджером дисплеев. Его потомки должны указать, какое окружение рабочего стола запущено. В моей системе менеджер дисплеев выполняет себя сам (с различными параметрами). Затем появляется [113157]x-session-manager[113158], который связан с [113159]xfce4-session[113160]. Этого может быть достаточно, но все дети от этого связаны с моим окружением рабочего стола. Их поиск через дерево процессов должен быть лучшим способом исключения элементов других оконных систем, запускаемых различными программами (или, возможно, намеренно).[12262]Первой моей мыслью было, что лучше всего искать оконный менеджер, связанный с вашим окружением рабочего стола, но часто можно настроить запуск другого менеджера (например, [113161]xmonad[113162] в Gnome), так что это не является надежным. Лучше всего искать тот, который управляет реальным рабочим столом, например [113163]xfdesktop[113164] или любым другим элементом окружения рабочего стола, который необходим для работы вашего скрипта :)[12263]Пример[12264]Вот пример использования [113165]procps-ng[113166] ([113167]-C[113168] и [113169]--ppid[113170], которые не являются POSIX). Предполагается, что это только один экземпляр [113171]Xorg[113172].[12265]Это всего лишь пример, который работает для рабочего стола xfce. Полный рабочий пример требует изучения процессов, используемых каждой настольной системой, так же как и большинство других решений требуют изучения того, как переменные окружения устанавливаются в различных других настольных системах.[12266]
    1
    27.01.2020, 19:41

    Вы можете использовать этот сценарий 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
    27.01.2020, 19:41

    Это работает как на Ubuntu 18.10 (, так и на космическом )[тип lxqt] и на Mint 19 (tara )[тип корицы] :

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

    Захват результата в переменную и выполнение дальнейшего необходимого кода с помощью способной аналитической логики (case stmt, if/then ), который включает любые/все распознанные типы оттуда; и/или корректно функционировать, когда используются нераспознанные типы.

    1
    27.01.2020, 19:41

    Стандарты сильно изменились с тех пор, как вопрос был задан в 2014 году.

    Для 2021 я рекомендую :использовать только официальный $XDG_CURRENT_DESKTOP.

    Обратите внимание, что официально это двоеточие -разделенный список(подобно $PATH), поэтому не думайте, что он содержит только одно значение, даже если оно есть в большинстве DE. Например, Unity Ubuntu установил его на Unity:Unity7:ubuntu.

    Если вы предпочитаете обрабатывать одно значение, используйте $XDG_SESSION_DESKTOP.

    Официальные стандарты:

    Другие связанные переменные среды уже должны считаться устаревшими.

    Функция bash для правильной проверки заданной строки в текущей среде рабочего стола:

    # Encapsulates the mess that DE detection was, is, or will ever be...
    # Without arguments, check if in a Desktop Environment at all
    # Subshell is intentional so we don't have to save/restore IFS
    # Case-insensitive comparison
    is_desktop_environment() (
        local de=${1:-}
        local DEs=${XDG_CURRENT_DESKTOP:-}
    
        # Shortcut: If de is empty, check if empty DEs
        if [[ -z "$de" ]]; then if [[ "$DEs" ]]; then return; else return 1; fi; fi
    
        # Lowercase both
        de=${de,,}; DEs=${DEs,,}
    
        # Check de against each DEs component
        IFS=:; for DE in $DEs; do if [[ "$de" == "$DE" ]]; then return; fi; done
    
        # Not found
        return 1
    )
    

    Тестирование:

    for de in "" Ubuntu Gnome KDE Unity; do
        if is_desktop_environment "$de"; then
            echo "Yes, this is ${de:-a DE}"
        else
            echo "No,  this is not ${de:-a DE}"
        fi
    done
    
    Yes, this is a DE
    Yes, this is Ubuntu
    No,  this is not Gnome
    No,  this is not KDE
    Yes, this is Unity
    
    1
    19.04.2021, 09:01

    Теги

    Похожие вопросы