如何在 CentOS 7 中设置非登录 shell 的 PATH?
具体来说,我有一个 systemd 单元,需要/usr/local/texlive/2016/bin/x86_64-linux
.
我尝试将其设置/etc/environment
为 withPATH=/usr/local/texlive/2016/bin/x86_64-linux:$PATH
但后来我的 PATH 是/usr/local/texlive/2016/bin/x86_64-linux:$PATH:/usr/local/sbin:/usr/sbin
.
我/etc/profile.d/texlive.sh
用它创建的export PATH="/usr/local/texlive/2016/bin/x86_64-linux:${PATH}"
,但这只适用于登录 shell。
我在看为所有用户设置路径(登录和非登录外壳)但上面已经尝试过该解决方案。
我在看如何在 debian 上为所有用户的非登录 shell 和登录 shell 添加系统 $PATH 路径但没有公认的解决方案,我不确定是否要修改,/etc/login.defs
因为它可能会在更新中发生变化。
答案1
最简单的答案是将其设置为 systemd 单元文件中命令PATH
的一部分。ExecStart
例如,如果您当前有
ExecStart=/bin/mycmd arg1 arg2
然后将其更改为
ExecStart=/bin/bash -c 'PATH=/new/path:$PATH exec /bin/mycmd arg1 arg2'
的扩展$PATH
将由 bash 完成,而不是 systemd。使用等替代方案Environment=PATH=/new/path:$PATH
将不起作用,因为 systemd 不会扩展$PATH
.
答案2
除非您使用Environment=
,EnvironmentFile=
或PassEnvironment=
, 否则您应该使用ExecSearchPath=
.
man systemd.exec
说关于ExecSearchPath=
:
采用冒号分隔的绝对路径列表,相对于 Exec*=(例如 ExecStart=、ExecStop= 等)属性使用的可执行文件可以找到。如果用户未通过 Environment=、EnvironmentFile= 或 PassEnvironment= 提供 $PATH,ExecSearchPath= 将覆盖 $PATH。分配空字符串会删除以前的分配,并且多次将 ExecSearchPath= 设置为某个值将附加到以前的设置。
答案3
我已经成功使用 env 程序(systemd 不允许通过配置文件更改它):
ExecStart=/usr/bin/env PATH=/usr/bin:/path1:/path2 mycmd arg1 arg2
请注意,env 不会启动一个新的 shell 来执行程序,这可能是也可能不是您想要的。