如何设置PATH或其他环境变量,以便X应用程序可以访问它?


16

如何设置环境变量,以便KDE识别它们?

如何在非Shell环境(KDE)中设置路径?

与以上两个问题不同,我想知道如何为GNOME执行此操作。或者更好的是,有没有一种独立于窗口管理器的方法。对于外壳/终端,我通常进行编辑~/.bashrc。无论在何处使用窗口管理器,我都可以在哪里放置导出语句,以便所有X应用程序都可以使用环境变量?

Answers:


12

通过pam_env PAM模块,您可以将其设置为中/etc/environment或中~/.pam_environment,具体取决于您是希望所有用户(系统范围)还是仅用户(会话范围)使用。

系统范围的环境变量

影响整个系统(而不是特定用户)的环境变量设置不应放置在加载系统或桌面会话时执行的许多系统级脚本中的任何一个中,而应放在

/etc/environment-该文件专门用于系统范围的环境变量设置。它不是脚本文件,而是由赋值表达式组成,每行一个。具体来说,此文件存储系统范围的语言环境和路径设置。

会话范围的环境变量

应该只影响特定用户(而不是整个系统)的环境变量设置应设置为:

~/.pam_environment-该文件专门用于设置用户的环境。它不是脚本文件,而是由赋值表达式组成,每行一个。

注意:使用.pam_environment需要重新登录才能初始化变量。仅重启终端不足以使用变量。

请参阅Ubuntu的环境变量Wiki上的更多内容。


2
~/.pam_environment解决方案的问题是,默认情况下,除非发行版对其进行了配置,否则pam_env模块不会读取它。例如,在Fedora 20上不会读取。
Cristian Ciupitu 2014年

@CristianCiupitu是正确的。~/.xsession将为X应用程序加载环境变量。参见unix.stackexchange.com/questions/47359/what-is-xsession-for
Tek

@CristianCiupitu:非常感谢您的评论,这使我进入了pam_env。我更新了Fedora 24 pam文件以启用用户环境。现在,我的Wayland会话都再次具有自定义的PATH。
Zan Lynx

@CristianCiupitu是真的吗?除非另有说明,否则文件linux-pam.org/Linux-PAM-html/sag-pam_env.html暗示〜/ .pam_environment是要读取的默认文件。请参阅user_envfile=filename。我的pam_env问题是,取决于PAM应用程序,HOME变量可能不可用。这限制了它只能用于绝对变量。
CMCDragonkai

2
Fedora的pam_env(8)手册页@CMCDragonkai曾说:默认情况下,此选项处于关闭状态,因为未经系统管理员同意,用户提供的PAM环境中的环境变量可能会影响堆栈中后续模块的行为”。因此,尽管上游PAM模块具有一些默认设置,但某些发行版会覆盖它们。
Cristian Ciupitu

1

/etc/X11/Xsession.d/...或该目录的内容,具体取决于您的Linux(?)。我在这里写了一些。

概念是,登录后,显示管理器将启动“ Xsession”并按字母顺序在该目录中获取所有内容!您只需添加修改PATH的脚本即可。Xsession将不幸地成为您的DE,通常所有进程都是该Xsession的子级,因此继承了PATH环境。


我可以在$ 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号(进程ID和父PID)。PID 1855由1497(由?组成的子代)启动,它由1481启动,后者由PID 1启动,而PID 1由祖先进程0启动。

对您要影响的过程进行类似的继承跟踪,找出哪些初始化文件是相关的,并在树中某处对PATH进行更改,可能类似于以下内容:

PATH=${PATH}:/usr/local/bin

我可以ps用来确定GUI登录的父进程吗?
Code-Guru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.