2016-12-02 2 views
0

Я пытаюсь использовать рыбу в качестве оболочки. Когда я вхожу в систему с LightDM, я хочу запустить определенные приложения Xsession, но только тогда, когда оболочка запускается в начале LightDM.Настройка параметра «Изменение окружающей среды для рыб» Только в функции

Я попытался это в ~/.config/рыбы/config.fish:

################################################################### 
# Start xsession applications, but only once. 
if test -z "$XSESSION_STARTED" 
    set -xg XSESSION_STARTED 'f' 
end 

if test "$XSESSION_STARTED" = 'f' 
    xsession-apps 
end 

Функция Xsession-приложения затем запускает все приложения в фоновом режиме и устанавливает переменную окружения в конце, как это :

set -xg XSESSION_STARTED "t" 

Но XSESSION_STARTED не появляется, чтобы установить на «т» и приводит к тому, Xsession-приложения функционируют, чтобы получить вызов каждый раз, даже когда я начинаю новый терминал в течение гнома перспективе.

Что мне не хватает. Есть ли лучший способ приблизиться к этому?

ответ

1

даже если я начинаю новый терминал в течение гнома.

Этого следовало ожидать. Глобальные переменные устанавливаются внутри этой конкретной рыбы. Если вы запустите другую рыбу, у нее ее не будет (если вы не запустите ее внутри этой рыбы, потому что она экспортируется).

Там несколько способов, чтобы подойти к этому:

  • Не делайте этого в config.fish вообще - использовать механизм автозапуска Дэ или, по крайней мере, ~/.xinitrc. Это лучший и самый чистый подход и независимо от вашей оболочки.

  • Используйте универсальные переменные - они сохраняются постоянно и совместно используются для всех сеансов рыб на машине. Проблема здесь недействительна - вам нужно снова отключить переменную после выхода из системы/перезагрузки, но если ваш компьютер разбился, это не произойдет

  • Используйте файл флага на tmpfs (то есть в ОЗУ) - это будет быть автоматически недействительным, если ваша машина останавливается, независимо от причины. Однако вам нужно настроить tmpfs.

+1

Одна вещь, которую @faho не подчеркивала, стоит отметить, что переменные среды (что вы получаете от 'set -gx') видны только программам, запущенным этой оболочкой. Когда вы открываете новый терминал, запуск которого запускается LightDM, который не знает об env var XSESSION_STARTED, поскольку он был создан дочерним процессом. Переменные окружения не отображаются в глобальном масштабе для каждого процесса в вашей системе. Это не то, как они работают. –

+0

Faho, спасибо за ответ. Помещение в ~/.xsessionrc работало, если я использовал функцию bash для запуска функции рыбы. Я поставлю свой код ниже. –

0

Вот код, который я использовал в ~/.xsessionrc:

# Apps launched directly by X window managers don't have their environment set 
if [ $SHELL = "/usr/bin/fish" ] 
then 
    /usr/bin/fish -c xsession-apps 
else 
    source ~/src/dotfiles/keychain.sh 
    source ~/src/dotfiles/shell/aliases 
    source ~/src/dotfiles/shell/env 
    source ~/src/dotfiles/xsession-apps 

    eval "$(~/.rbenv/bin/rbenv init -)" 
fi 

Он инициализирует рыбу или Баш/ЗШ, в зависимости от того, что я нахожусь в настроении в то время. В последнее время мне нравится рыба. Затем я определил функцию рыбы, названную xsession-apps, для запуска вещей, которые я хотел запустить в моей X-сессии, таких как dropbox, hplip, xmobar и т. Д. У меня есть аналогичная настройка как скрипт bash, также называемый xsession-apps, который получает источники, м, не используя рыбу.

Кстати, я использую xmonad в качестве среды для окон.

Смежные вопросы