与以上两个问题不同,我想知道如何为GNOME执行此操作。或者更好的是,有没有一种独立于窗口管理器的方法。对于外壳/终端,我通常进行编辑~/.bashrc
。无论在何处使用窗口管理器,我都可以在哪里放置导出语句,以便所有X应用程序都可以使用环境变量?
与以上两个问题不同,我想知道如何为GNOME执行此操作。或者更好的是,有没有一种独立于窗口管理器的方法。对于外壳/终端,我通常进行编辑~/.bashrc
。无论在何处使用窗口管理器,我都可以在哪里放置导出语句,以便所有X应用程序都可以使用环境变量?
Answers:
通过pam_env PAM模块,您可以将其设置为中/etc/environment
或中~/.pam_environment
,具体取决于您是希望所有用户(系统范围)还是仅用户(会话范围)使用。
系统范围的环境变量
影响整个系统(而不是特定用户)的环境变量设置不应放置在加载系统或桌面会话时执行的许多系统级脚本中的任何一个中,而应放在
/etc/environment
-该文件专门用于系统范围的环境变量设置。它不是脚本文件,而是由赋值表达式组成,每行一个。具体来说,此文件存储系统范围的语言环境和路径设置。
会话范围的环境变量
应该只影响特定用户(而不是整个系统)的环境变量设置应设置为:
~/.pam_environment
-该文件专门用于设置用户的环境。它不是脚本文件,而是由赋值表达式组成,每行一个。注意:使用
.pam_environment
需要重新登录才能初始化变量。仅重启终端不足以使用变量。
请参阅Ubuntu的环境变量Wiki上的更多内容。
~/.xsession
将为X应用程序加载环境变量。参见unix.stackexchange.com/questions/47359/what-is-xsession-for
user_envfile=filename
。我的pam_env问题是,取决于PAM应用程序,HOME变量可能不可用。这限制了它只能用于绝对变量。
/etc/X11/Xsession.d/
...或该目录的内容,具体取决于您的Linux(?)。我在这里写了一些。
概念是,登录后,显示管理器将启动“ Xsession”并按字母顺序在该目录中获取所有内容!您只需添加修改PATH的脚本即可。Xsession将不幸地成为您的DE,通常所有进程都是该Xsession的子级,因此继承了PATH环境。
/etc/X11/Xsession.d/40x11-common_xsessionrc
源全局环境变量。如果文件存在,此脚本将在$ HOME / .xsessionrc中提供任何内容。这使用户可以为其X会话设置全局环境变量,例如语言环境信息。
进程从启动它的父进程继承环境。要更改子级中的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登录的父进程吗?
~/.pam_environment
解决方案的问题是,默认情况下,除非发行版对其进行了配置,否则pam_env模块不会读取它。例如,在Fedora 20上不会读取。