环境变量的范围

环境变量的范围

我之前曾想过,环境变量是在进程范围内定义的,如果导出,也会传播到子进程。

因此,我想找到一个地方来定义我的环境变量,并可以通过以下方式访问:

  1. 用户服务,定义于 ~/.config/systemd/user/start-up.service
  2. Hyprland.conf 文件
  3. ZSH外壳

我使用带有 sddm、hyprland、kitty 终端和 zsh shell 的 arch linux。我尝试了多种解决方案,唯一有效的解决方案是在 hyprland.conf 文件中定义环境变量(实际上是在外部文件中,由 hyprland 提供),并对服务所需的两个环境变量进行重复定义在服务环境领域。我无法使用 EnvironmentFile,因为 hyprland 和服务文件之间的预期格式不匹配。由于重复,我不喜欢这个解决方案。

但在我的调查过程中,我发现了非常令人惊讶的事情:hyprland.conf 中定义的所有环境变量在 zsh shell 中都是可见的,该 shell 不是 hyprland 进程的子进程。

pstree
systemd─┬─NetworkManager───4*[{NetworkManager}]
        ├─dbus-daemon
   ==>  ├─kitty─┬─zsh───pstree
        │       └─2*[{kitty}]
        ├─polkitd───3*[{polkitd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─sddm─┬─Xorg───2*[{Xorg}]
   ==>  │      ├─sddm-helper───Hyprland───4*[{Hyprland}]
        │      └─{sddm}
        ├─sh───sleep
        ├─ssh-agent
        ├─systemd─┬─(sd-pam)
        │         ├─dbus-daemon
        │         ├─gnome-keyring-d───4*[{gnome-keyring-d}]
        │         ├─pipewire───2*[{pipewire}]
        │         ├─pipewire-pulse───2*[{pipewire-pulse}]
        │         ├─wireplumber───6*[{wireplumber}]
        │         ├─2*[xdg-desktop-por───4*[{xdg-desktop-por}]]
        │         ├─xdg-document-po─┬─fusermount3
        │         │                 └─6*[{xdg-document-po}]
        │         └─xdg-permission-───3*[{xdg-permission-}]
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        ├─upowerd───3*[{upowerd}]
        └─wpa_supplicant

所以,我其实有两个问题:

  1. 是否有一个地方可以定义环境变量(应该在用户级别定义,而不是系统范围内定义),以便对用户服务、hyprland 和 shell 可见
  2. hyprland.conf 中定义的变量怎么可能对其 subling 进程可见?

相关内容