前言¶
在 DSH 里让智能体执行 node、python 或项目脚本时,shell 的解析规则往往比记忆更长:PATH 顺序、Windows 上的 PATHEXT、可执行位、内置命令短路等,共同决定「敲下这个名字时实际跑的是哪一个文件」。常见情况是命令能跑,却不是你以为的那一个——两套 Node 同在 PATH 上,没有任何地方会主动告诉你 winner 是哪一个。
系统自带的 which 在 Windows 上不可用,且即便存在,通常也只回答「找到了谁」,不回答「跳过了谁」。dsh-which 是面向 DeepSeek Harness 的插件,把解析结果、被挡住的同名副本、PATH 本身的健康度,以及(可选)各副本报告的版本,整理成可读的诊断报告。
这是什么¶
dsh-which(GitHub:11111353535/dsh-which,维护者 11111353535)的定位是 Command resolution forensics:报告某条命令实际解析到哪个文件、shadow 了哪些同名路径、PATH 呈什么形状,以及多个副本是否对版本说法一致。社区目录分类为 admin-security。
插件不负责改 PATH;README 明确说明只做报告,避免静默改写环境。
与 which 的差异(设计动机)¶
下面几点来自官方 README,说明为何单独做一套解析逻辑:
- Windows 上没有通用的
which;有which的环境也只覆盖更窄的问题。 - 用 shell 里的解析器去解释「解析规则」等于信任正在被调试的对象。本插件在
lib/resolve.js中用纯函数、可注入文件系统重实现规则,便于用 fixture 测试。 - 内置命令(如
cd)不是文件;插件会标明builtin,并说明未查 PATH。 - 诊断价值往往在 shadowed 条目:全局旧安装挡在本地新安装前、
.cmdshim 挡在真实二进制前、文件存在但不可执行等。 - 默认不自动改 PATH,避免「修环境」类插件悄悄弄坏机器。
核心能力:四个工具¶
安装后通过 Cordis 暴露以下工具(名称与参数以 README 为准)。
which_resolve¶
解析单个命令名或显式路径,输出 winner、类型、来自哪条 PATH、大小、修改时间等;可选对 winner 及 shadow 副本做版本探测。
| 参数 | 说明 |
|---|---|
command(必填) |
命令名(如 node)或路径(如 ./build.sh) |
probe |
对 winner 执行版本探测 |
probeShadowed |
对 shadow 副本也探测,便于对比版本 |
显式路径不查 PATH,报告会写明 given as a path, PATH was not consulted。解析不到也是正常答案(如 not found,并说明名称在 PATH 上存在但无可执行文件)。
which_path¶
按解析顺序列出 PATH 每一项:重复项、目录已不存在(dead entry)、未展开的变量等;默认省略 /usr/bin 等「噪声」目录,可用 showNoise 打开。
| 参数 | 说明 |
|---|---|
showNoise |
是否包含常见系统目录 |
limit |
最多列出条数,默认 40 |
which_env¶
一页汇总命令环境:平台、shell、工作目录、PATH 摘要、PATHEXT(Windows),以及配置里 runtimes 列表中各运行时解析到哪里。
| 参数 | 说明 |
|---|---|
limit |
最多列出的运行时数量,默认 30 |
which_sweep¶
扫描指定目录下像命令名的脚本,逐项说明「若只在这个目录里同名,全局解析会不会跑到别处」。
| 参数 | 说明 |
|---|---|
directory(必填) |
绝对路径或相对工作区 |
limit |
最多行数,默认 60 |
安装与配置¶
在 DSH 环境中执行官方安装命令:
dsh plugin add https://github.com/11111353535/dsh-which
若从本地检出目录安装,使用绝对路径:
dsh plugin add /absolute/path/to/dsh-which
可选配置写在 profile 的 cordis.patch.yml 中,插件 id 为 which:
- id: which
name: 'dsh-which'
config:
probeByDefault: false # 每次解析都跑版本探测
probeShadowedByDefault: false # 对 shadow 副本也探测
probeTimeoutMs: 4000
maxSweepFiles: 400
runtimes: [node, npm, pnpm, python, git]
| 配置项 | 默认值 | 作用 |
|---|---|---|
probeTimeoutMs |
4000 |
版本探测超时(毫秒) |
probeByDefault |
false |
是否默认探测每次解析(更慢) |
probeShadowedByDefault |
false |
是否默认探测 shadow 副本 |
maxSweepFiles |
400 |
单次 sweep 最多检查文件数 |
runtimes |
见 README 表格 | which_env 要解析的常见命令名列表 |
默认关闭探测,是因为会拉起子进程;README 称每次调用若固定多等数秒,用户往往会关掉该功能。
package.json 标明引擎要求为 Node ^22.19.0 || >=24.0.0,许可证 MIT,当前版本 0.1.0。
典型输出示例¶
解析 node 时,报告会标出 winner、来源 PATH 下标、shadow 的其他目录,以及版本不一致时的警告(实际执行的是 PATH 顺序靠前的那一个):
dsh-which · node
winner: C:\Program Files\nodejs\node.EXE
kind: native binary
from: PATH[0] C:\Program Files\nodejs
...
shadowed — 1 other directory holds this name:
PATH[6] C:\Users\me\scoop\shims\node.EXE ...
↳ reports v20.11.1
⚠ the copies behind this name report different versions — the one that runs is the one at PATH[0].
查看 PATH 形状时,会统计重复项与 dead entry,并提示「改 PATH 时只改了一处、另一处重复仍在」类问题。
智能体侧典型用法是:环境异常、版本对不上、脚本「明明在目录里却跑错」时,先调 which_resolve 或 which_env,再按需 probe / probeShadowed;项目脚本目录与全局命令冲突时,用 which_sweep 对照。
适用场景与注意¶
适合谁:需要在 DSH / 智能体会话里做 命令与环境取证 的开发者与运维——多版本运行时、包管理器 shim、PATH 被安装器反复 prepend、或「命令存在但不可执行」等 silent failure。
权限与安全:插件以 当前 dsh 进程 的权限与环境运行,会读取 PATH、探测可执行文件并在开启 probe 时启动子进程。安装前应在 GitHub 查阅源码与 MIT 许可证,确认符合你的安全策略;社区目录(SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系,不宜当作官方应用商店。
局限:只做诊断报告,不提供 PATH 编辑;大目录 sweep 受 maxSweepFiles 限制;版本探测默认关闭,需要时在工具参数或配置中显式打开。
结尾¶
dsh-which 把 shell 已做出的解析决定摊开成结构化报告:谁赢、谁被挡住、PATH 是否重复或残缺、同名副本版本是否一致。在 DSH「一切皆插件」的生态里,它属于 admin-security 类辅助能力,用于减少「命令能跑但不是那一个」的排查时间。