EnvironmentFile
不是一个选项这个答案。
我试图了解使用和传递环境变量的推荐方式。
我有一个urxvtd.socket
:
[Unit]
Description=urxvt deamon (socket activation)
Documentation=man:urxvtd(1) man:urxvt(1)
[Socket]
ListenStream=%t/urxvt/urxvtd-%H
[Install]
WantedBy=sockets.target
现在urxvtd.socket
依赖Requires
于 urxvtd.socket:
[Unit]
Description=Urxvt Terminal Daemon
Requires=urxvtd.socket
[Service]
# Needs to know socket file location RXVT_SOCKET environment variable.
# Where will it come from?
ExecStart=/usr/bin/urxvtd -o -q
[Install]
WantedBy=default.target
现在我需要RXVT_SOCKET
在启动 i3 之前进行设置,因为 i3 将有一个键绑定来启动urxvtc
(urxvt 客户端)。
如果我在没有 systemd 的情况下启动 i3/Xorg(即使用 xinitrc),然后输入.zshenv
(始终加载用户特定的环境文件。):
export RXVT_SOCKET=${XDG_RUNTIME_DIR}/urxvt/urxvtd-machinename
然后urxvtc
由 i3 启动将正确推断 RXVT_SOCKET 变量并在该路径中查找套接字。
但是,urxvtd.service
由于启动urxvtd
(守护进程),因此它还需要 RXVT_SOCKET。
Archwiki 建议将环境设置为urxvtd.service
:
...
Environment=RXVT_SOCKET=%t/urxvtd-%H
...
但问题就在于此。urxvtd.service
当初始用户urxvtd.socket
应该设置环境变量时,为什么要在 中再次设置环境变量?
注意,i3 需要再次设置.zshenv
才能获取它。这是一个简单环境变量有多个事实来源的情况。。
我们是否注意到urxvtd.service
上面的示例中设置的 RXVT_SOCKET 路径不正确.zshenv
?重申我的多重事实来源论证。
处理这个问题的最佳方法是什么?
urxvtd.socket
我在想也许我可以这样设置 RXVT_SOCKET :
[Socket]
Environment=RXVT_SOCKET
ListenStream=%t/urxvt/urxvtd-%H
既然urxvtd.service
是依赖项,那么应该有一种方法来导入环境变量。但没有。因此 urxvtd 守护进程的行为就像未设置 RXVT_SOCKET 一样,但由于urxvtd.socket
.
然后我更深入地挖掘,systemctl --user import-environment RXVT_SOCKET
应该跨 systemd 单元导入变量。真的会这样吗?然后我还需要确保导入发生前urxvtd.service 运行。那会如何运作呢?
如果我确实将 Xorg/i3 与 systemd 一起使用,我相信应该有一种方法可以跨 systemd 单元传输环境变量。
在这一点上,我可能相信没有纯粹的 systemd 解决方案来满足这种环境变量传播的要求
我最终使用 shell 来包装ExecStart
命令,因为 shell 将正确继承环境。