launchctl 配置用户路径有什么作用?

Phu*_*yen 11 macos shell terminal zsh launchctl

我在 MacOS 中的 PATH 环境变量遇到了一个奇怪的问题,我花了几个小时来调试:

  • 前段时间,当我试图解决 IntelliJ 终端 PATH 变量与 iTerm 不同的问题时,我按照网上的一篇文章并执行了以下命令:

    sudo launchctl config user path $PATH

  • 显然,这个命令会在某个时刻设置并保留 PATH 变量的值,并且每当我启动新的 zsh 会话时,甚至在加载 shell 之前都会加载该变量。直到最近我才意识到这个问题,因为我删除了我的一些路径位置设置zshrc,并且PATH变量仍然没有反映

  • 我的问题是该命令在哪里存储PATH变量值?在加载我的 shell 之前它如何加载该值?

(对于想知道我如何解决问题的人:我再次执行命令以将路径设置为空值sudo launchctl config user path '':)

luc*_*212 15

命令sudo launchctl config user path <...>更新/private/var/db/com.apple.xpc.launchd/config/user.plist

$ cat /private/var/db/com.apple.xpc.launchd/config/user.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PathEnvironmentVariable</key>
    <string>/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

在我的系统上进行了测试,目前是 macOS 14.2.1 (AppleSilicon)。您可以替换usersystem以对系统范围的首选项进行操作。奇怪的是,两者都需要 sudo。

您可以使用以下命令查询launchd的当前自定义PATH 设置(如果尚未配置,将返回空字符串):

$ cat /private/var/db/com.apple.xpc.launchd/config/user.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PathEnvironmentVariable</key>
    <string>/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

您可以通过执行以下命令查询默认值: PATH

launchctl getenv PATH
Run Code Online (Sandbox Code Playgroud)

要撤消任何自定义,您可以发出:

sysctl -n user.cs_path
Run Code Online (Sandbox Code Playgroud)

(需要重启才能生效)

  • @PhuongNguyen:我暴力地强迫它:我使用命令添加了一个不存在的虚拟路径,例如“xyzzy”,然后使用 ripgrep 在整个文件系统中搜索该字符串。花了一段时间,但还是找到了。 (7认同)
  • 出于好奇,您是如何发现这一点的?网上关于launchctl的文档并不多 (2认同)