bun 遵循 XDG 规范,所以它使用这些环境变量来确定缓存和配置目录
12 2026-03-25 21:40 2026-03-25 22:21
cat ~/.bunfig.toml 2>/dev/null
root@iv-yehwqq2g3kcva4g8v94k[21:36:51]:~/.bun/install/global/node_modules/@tobilu/qmd
Send-Command 66 of 479 > _ # cat /etc/bunfig.toml 2>/dev/null
root@iv-yehwqq2g3kcva4g8v94k[21:36:59]:~/.bun/install/global/node_modules/@tobilu/qmd
Send-Command 67 of 480 > _ # cat .bunfig.toml 2>/dev/null
root@iv-yehwqq2g3kcva4g8v94k[21:37:04]:~/.bun/install/global/node_modules/@tobilu/qmd
bun pm bin
/root/.bun/install/global/node_modules/@tobilu/qmd/node_modules/.bin
root@iv-yehwqq2g3kcva4g8v94k[21:37:25]:~/.bun/install/global/node_modules/@tobilu/qmd
Send-Command 69 of 482 > _ # bun pm bin -g
/root/.openclaw/agents/main/qmd/xdg-cache/.bun/bin
warn: not in $PATH
root@iv-yehwqq2g3kcva4g8v94k[21:37:32]:~/.bun/install/global/node_modules/@tobilu/qmd
Send-Command 70 of 483 > _ # bun pm cache
/root/.openclaw/agents/main/qmd/xdg-cache/.bun/install/cacheroot@iv-yehwqq2g3kcva4g8v94k[21:37:39]:~/.bun/install/global/node_modules/@tobilu/qmd
env | grep XDG
XDG_CONFIG_HOME=/root/.openclaw/agents/main/qmd/xdg-config
XDG_SESSION_TYPE=tty
XDG_CACHE_HOME=/root/.openclaw/agents/main/qmd/xdg-cache
XDG_SESSION_CLASS=user
XDG_SESSION_ID=42
XDG_RUNTIME_DIR=/run/user/0
找到问题了!
根本原因
XDG_CACHE_HOME 和 XDG_CONFIG_HOME 被设置到了 .openclaw 目录:
-
XDG_CACHE_HOME=/root/.openclaw/agents/main/qmd/xdg-cache -
XDG_CONFIG_HOME=/root/.openclaw/agents/main/qmd/xdg-config
bun 遵循 XDG 规范,所以它使用这些环境变量来确定缓存和配置目录,这就是为什么 bun pm bin -g 和 bun pm cache 都指向了 .openclaw 路径。
但是你的实际全局包安装却在使用 /root/.bun,造成了不一致。
解决方案
选项 1:统一使用 XDG 目录(推荐)
让 bun 完全遵循 XDG 规范,将所有内容移到 .openclaw 目录下:
bash
# 将现有的全局包迁移到 XDG 目录 mkdir -p /root/.openclaw/agents/main/qmd/xdg-cache/.bun mv /root/.bun /root/.openclaw/agents/main/qmd/xdg-cache/ # 创建软链接保持兼容(可选) rm -rf /root/.bun ln -s /root/.openclaw/agents/main/qmd/xdg-cache/.bun /root/.bun # 重新加载环境 exec bash --login
选项 2:覆盖 bun 的行为(更简单)
通过 ~/.bunfig.toml 强制 bun 使用 /root/.bun:
bash
cat > ~/.bunfig.toml << 'EOF' [install] # 忽略 XDG,使用传统目录 prefix = "/root/.bun" [install.cache] dir = "/root/.bun/install/cache" EOF # 测试是否生效 bun pm cache bun pm bin -g
选项 3:临时清除 XDG 变量(仅当前会话)
如果你只是想让 bun 在当前会话中正常工作:
bash
# 临时清除(仅当前 shell 会话) unset XDG_CACHE_HOME unset XDG_CONFIG_HOME # 测试 bun pm cache bun pm bin -g
关于这些 XDG 变量
这些变量很可能是由 openclaw 工具设置的,用于隔离环境。如果你主要使用 openclaw 环境,那么选项 1(统一到 XDG 目录)可能更合适。
如果这些变量不是必需的,可以在 ~/.bashrc 中注释掉设置它们的行:
bash
# 查找设置位置 grep -n "XDG" ~/.bashrc ~/.profile ~/.bash_profile
推荐做法
我建议选项 2(创建 ~/.bunfig.toml),因为:
-
最简单,不影响其他程序
-
保持你现有的
/root/.bun安装不变 -
不需要移动文件
-
明确告诉 bun 忽略 XDG 环境变量
执行选项 2 后,再次运行 bun pm bin -g 应该就能返回正确路径了。
全部评论