dsh-which:命令解析取证,看清 PATH 上谁赢、谁被挡住

前言

在 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,说明为何单独做一套解析逻辑:

  1. Windows 上没有通用的 which;有 which 的环境也只覆盖更窄的问题。
  2. 用 shell 里的解析器去解释「解析规则」等于信任正在被调试的对象。本插件在 lib/resolve.js 中用纯函数、可注入文件系统重实现规则,便于用 fixture 测试。
  3. 内置命令(如 cd)不是文件;插件会标明 builtin,并说明未查 PATH。
  4. 诊断价值往往在 shadowed 条目:全局旧安装挡在本地新安装前、.cmd shim 挡在真实二进制前、文件存在但不可执行等。
  5. 默认不自动改 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 类辅助能力,用于减少「命令能跑但不是那一个」的排查时间。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜