先用 npm ls -g --depth=0 确认包真的装上了,再用 npm bin -g 找到全局 bin 目录并加进 PATH。如果你用 nvm 或 fnm,全局安装只属于当时激活的那个 Node 版本。
安装打印了成功,shell 却不认。绝大多数情况是下面三种成因之一,而且有一条命令能直接分辨。
第一步:它到底装上了吗
npm ls -g --depth=0在输出里找 @deepseek-ai/dsh。
没有? 说明安装其实失败了,不管刚才滚过去的最后一行写了什么。重跑一遍,这次读输出的尾部而不是 最后一行:
npm install -g @deepseek-ai/dsh有? 包在磁盘上,这是 PATH 问题,继续往下。
第二步:npm 的全局 bin 在 PATH 上吗
npm bin -g它打印 npm 放全局可执行文件的目录,可能是 /usr/local/bin、/opt/homebrew/bin 或
~/.npm-global/bin。检查它在不在 PATH 里:
echo $PATH | tr ':' '\n' | grep -F "$(npm bin -g)"没有输出就说明缺失。加进 shell 配置文件——现代 macOS 是 ~/.zshrc,多数 Linux 是 ~/.bashrc:
export PATH="$(npm bin -g):$PATH"然后开一个新 shell,或者 source 一下。已经在跑的 shell 不会自己重读配置。
第三步:你还在当初装它的那个 Node 版本上吗
这条专门坑那些每一步都做对了的人。
nvm、fnm、volta 给每个 Node 版本各自一套全局包目录。在 Node 20 下装的全局包,在 Node 22
下并不存在。如果你装好了 dsh,后来切换或升级了 Node,命令就消失了——原因就在这。
node -v
nvm ls # 或者 fnm list两条出路。在你现在用的版本下重装:
npm install -g @deepseek-ai/dsh或者用 nvm 升级时把全局包一起迁移:
nvm install 22 --reinstall-packages-from=20EACCES 变体
如果安装本身报 EACCES: permission denied,那是 npm prefix 指向了 root 拥有的目录。别用 sudo 糊,
详见 EACCES 权限报错怎么修。
临时出口
在你捋 shell 配置的同时,你并没有被卡住:
npx @deepseek-ai/dsh webnpx 完全不碰 PATH,直接解析并运行这个包。
还是不行?
确认二进制文件真的在 npm 说的位置:
ls -l "$(npm bin -g)/dsh"文件在却跑不起来,检查它有没有可执行权限(chmod +x),以及你是不是被某个 shell 别名或函数遮住了:
type -a dshtype -a 会按解析顺序列出 shell 能看到的每一个 dsh——包括你早就忘掉的、写在某个配置文件里的别名。
常见问题
不修 PATH 能用吗?
能。npx @deepseek-ai/dsh web 不依赖 PATH。作为排查期间的临时办法很好用,如果你只是偶尔用 harness,长期这么用也没问题。
该用 sudo npm install -g 吗?
不该。它看起来能解决 EACCES,但会在 npm 缓存和全局目录里留下 root 拥有的文件,之后的安装会以更难定位的方式失败。改 npm prefix 或者用 Node 版本管理器。