我正在使用 systemd 来启动 Emacs 守护进程,如中所述Emacs 维基。
我还使用我的~/.profile
文件将用户安装的 TeX Live 安装添加到PATH
变量中,因此它包含行
PATH="$HOME/.local/texlive/2023/bin/x86_64-linux:$PATH"
显然,emacs 守护进程是在执行该行之前启动的。[M-x] getenv [RET] PATH
显示 texlive 目录不是PATH
emacs 所知道的一部分。
注意
systemctl --user show-environment
给出正确的路径,以便执行
systemctl restart --user emacs
解决当前会议的情况。
有没有办法让 systemd.profile
在启动用户服务之前等待文件执行?
答案1
设置用户服务环境的标准方法在人类环境.d。通常,您会创建一个文件
~/.config/environment.d/90texlive.conf
,例如包含以下行
PATH="$HOME/.local/texlive/2023/bin/x86_64-linux:$PATH"
该文件由 systemd 解析,因此请注意语法有限,但通常可以使其与 shell 兼容,因此如果您不想在那里重复该行,则可以source
从您的文件中获取它。测试时.profile
记得做一个。systemctl --user daemon-reload
请注意,systemd 将 PATH 初始化为可能不像您的 shell 通常获取的那么广泛,因此您可能还需要其他配置行或文件。
您的 PATH 最终如何.profile
进入 systemd 的环境?桌面启动的某些部分可能会执行类似的操作
systemctl --user import-environment
或者
dbus-update-activation-environment --systemd --all
答案2
等待.profile
执行对解决您的问题没有帮助,因为用户服务不是执行的 shell 的子进程~/.profile
,所以无法从中继承任何环境变量设置。
如果您想$PATH
为您的进行自定义emacs.service
,则必须在服务文件(或覆盖文件)中进行操作,可能需要使用部分Environment=
中的选项[Service]
。请注意,该选项不会执行环境变量扩展Environment=
,因此您将无法使用$HOME
or $PATH
,但您可以使用%h
来引用用户的主目录。
因此,Environment=
您需要的行可能是这样的:
Environment="PATH=%h/.local/texlive/2023/bin/x86_64-linux:%h/bin:/usr/local/bin:/usr/bin:/bin"