我正在尝试设置 Ubuntu 22.10 的全新安装。我需要使一些环境变量全局可用。我在手册页中读到,正确的方法是在 /etc/environment.d 目录中提供一个文件,其名称类似于 90-myfile.conf。当我尝试这样做时,环境变量未建立。相反,如果我将变量定义放入 /etc/environment,它将被选中。我还需要做其他什么吗?使用 bash 之类的命令处理器是不可行的,因为变量需要全局可用。
答案1
在 unix 中,环境从父进程传递到子进程。父进程完全控制子进程的初始环境。默认情况下,子进程会继承父进程的环境,但父进程可以传递完全不同的东西,子进程随后可以更改它。因此,不存在“全局”环境。存在“初始”环境,但没有全局环境。
因此,如果没有明确设置任何内容,则环境将从分叉之前最后设置的父进程继承。
每个操作系统(和每个发行版)处理初始环境设置的方式都不同。由于这是关于 Ubuntu 的问题,所以我将内容限制在此。
在 Ubuntu 中,systemd 启动第一个进程,并控制初始环境。Systemd 选择不在其自身内设置全局默认环境,但它提供了在不同上下文中设置变量的功能。
- systemd-environment-d-generator 为用户管理器实例设置初始环境。
- systemd.environment-generator 为每个管理服务提供单独的配置文件
- pam_env.conf 修改登录用户的环境(请参阅 environ(7) 和 pam_env.conf 的手册页)
- 对于 bash 和 sh,
/etc/environment
可以在 shell 启动时设置变量;这些变量可以由子进程继承。大多数 shell 实例都会读取此变量,但有些则不会,并且可以明确告知它们不要读取。 - 每个 shell 都可以读取
/etc/profile
或,/etc/bash.bashrc
进而可以从中读取文件/etc/profile.d
,但同样,并非每个 shell 实例都会这样做,并且可以告知 shell 不要读取这些或只读取这些。 - 每个用户的 shell 初始化文件都可以修改环境。
- 类似程序
ssh
具有sudo
变量白名单和黑名单,这些变量是为子进程有意继承或有意删除的。 - systemd 和 cron 等服务通常继承并传递一组非常小的环境变量。Cron 允许在每个配置文件中设置该配置文件的“全局”变量。
- 该
env
命令可以在启动之前修改其环境。
此列表并不详尽,可能还有更多来源。并且这些都不是“全局”的——环境变量明确地是每个进程的本地变量,尽管它们可以从全局源继承。