Как установить переменную PATH или другие переменные среды, чтобы приложения X могли получить к ней доступ?

16

Как я могу установить переменные env, чтобы KDE распознавал их?

Как установить путь в среде без оболочки (KDE)?

В отличие от двух вышеупомянутых вопросов, я хочу знать, как это сделать для GNOME. Или еще лучше, есть ли метод, который не зависит от оконного менеджера. Для оболочки / терминала я обычно редактирую ~/.bashrc. Где можно разместить операторы экспорта, чтобы переменные среды были доступны для всех приложений X, независимо от того, использовался ли оконный менеджер?

Код-Guru
источник

Ответы:

12

Модуль pam_env PAM позволяет вам устанавливать их как в, так /etc/environmentи в ~/.pam_environmentзависимости от того, хотите ли вы его для всех пользователей (для всей системы) или только для вашего пользователя (для всей сессии).

Общесистемные переменные среды

Параметры переменных среды, которые влияют на систему в целом (а не только на конкретного пользователя), не следует помещать ни в один из многих сценариев системного уровня, которые выполняются при загрузке системы или сеанса рабочего стола, а в

/etc/environment- Этот файл специально предназначен для общесистемных настроек переменных среды. Это не файл сценария, а скорее состоит из выражений присваивания, по одному на строку. В частности, этот файл хранит общесистемные настройки языка и пути.

Переменные среды сеанса

Настройки переменных среды, которые должны влиять только на конкретного пользователя (а не на систему в целом), должны быть установлены в:

~/.pam_environment- Этот файл специально предназначен для настройки среды пользователя. Это не файл сценария, а скорее состоит из выражений присваивания, по одному на строку.

Примечание: использование .pam_environmentтребует повторного входа в систему для инициализации переменных. Перезапуска только терминала недостаточно для использования переменных.

Смотрите больше в вики Ubuntu по переменным окружения .

bahamat
источник
2
Проблема с ~/.pam_environmentрешением состоит в том, что по умолчанию модуль pam_env не читает его, если дистрибутив не настроит его иначе. На Fedora 20 это не читается например.
Кристиан Чиупиту
@CristianCiupitu прав. ~/.xsessionзагрузит переменные окружения для приложений X См. Unix.stackexchange.com/questions/47359/what-is-xsession-for
Tek
@CristianCiupitu: Большое спасибо за ваш комментарий, который привел меня к pam_env. Я обновил свои файлы pam Fedora 24, чтобы включить пользовательскую среду. Теперь у всех моих сессий Wayland снова есть свой собственный PATH.
Zan Lynx
@CristianCiupitu это правда? В документации linux-pam.org/Linux-PAM-html/sag-pam_env.html подразумевается, что ~ / .pam_environment является файлом по умолчанию для чтения, если не указано иное. Смотрите строку на user_envfile=filename. Моя проблема с pam_env заключается в том, что переменная HOME может быть недоступна в зависимости от приложения PAM. Что ограничивает его использование только абсолютными переменными.
CMCDragonkai
2
@CMCDragonkai, справочная страница pam_env (8) из Fedora, говорила: « По умолчанию эта опция отключена, поскольку пользовательские переменные среды в среде PAM могут влиять на поведение последующих модулей в стеке без согласия системного администратора» . Таким образом, в то время как модуль PAM вышестоящего модуля имеет некоторые настройки по умолчанию, некоторые дистрибутивы перезаписывают их.
Кристиан Чупиту
1

/etc/X11/Xsession.d/... или в соответствии с этим каталогом, в зависимости от вашего Linux (?). Я написал немного об этом здесь .

Концепция заключается в том, что после входа в систему менеджер дисплеев запускает «Xsession» и получает (!) Все в этом каталоге в алфавитном порядке. Вы можете просто добавить скрипт, который изменяет PATH. Xsession, безусловно, будет вашим DE, и обычно все процессы являются дочерними для этого Xsession, поэтому наследуют среду PATH.

Bananguin
источник
Есть ли эквивалент, который я могу установить в моем каталоге $ HOME? Нравится .Xsession?
Code-Guru
Согласно Xession (5): /etc/X11/Xsession.d/40x11-common_xsessionrc исходные глобальные переменные среды. Этот скрипт будет получать что-либо в $ HOME / .xsessionrc, если файл присутствует. Это позволяет пользователю устанавливать глобальные переменные среды для своего сеанса X, например информацию о локали.
Bananguin
1

Процесс наследует среду от родительского процесса, который его запускает. Чтобы изменить переменную PATH или другие значения среды в дочернем элементе, мы можем установить переменную в значение в родительском элементе и экспортировать переменную, если мы находимся в оболочке, а затем запустить дочерний процесс. Дочерний также может прочитать один или несколько файлов инициализации, чтобы изменить свою среду при запуске.

Итак, есть еще два вопроса, чтобы получить ответ:

Что такое дерево наследования родитель / потомок, которое приводит к процессу, на который вы хотите повлиять PATH или изменение среды?

Какие файлы инициализации используются / считываются / получены из соответствующих процессов в этом дереве?

Вот часть вывода ps (1), чтобы показать, что я подразумеваю под деревом наследования:

# /bin/ps -o 'uid:5,pid:5,ppid:5,user:4,args' axf 

UID   PID  PPID USER COMMAND
  0     1     0 root /usr/lib/systemd/systemd
  0  1481     1 root /usr/sbin/gdm-binary -nodaemon
  0  1497  1481 root  \_ /usr/libexec/gdm-simple-slave ...
  0  1504  1497 root      \_ /usr/bin/Xorg :0 ...
  0  1855  1497 root      \_ gdm-session-worker ...

Обратите внимание на графические последовательности \ _ и номера PIP / PPID (идентификатор процесса и родительский идентификатор). PID 1855 был запущен (какой-то ребенок?) 1497, который был запущен в 1481, который был запущен PID 1, который был запущен процессом-предком 0.

Выполните аналогичную трассировку наследования для процесса, на который вы хотите повлиять, выясните, какие файлы инициализации являются релевантными, и внесите изменения в PATH где-то в этом дереве, возможно, с помощью чего-то похожего на:

PATH=${PATH}:/usr/local/bin
D МакКеон
источник
Могу ли я использовать psдля определения родительского процесса входа в систему GUI?
Code-Guru