bun 遵循 XDG 规范,所以它使用这些环境变量来确定缓存和配置目录

11 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_HOMEXDG_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 -gbun 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 应该就能返回正确路径了。

全部评论

·