dsh-mingw:在 Windows 上用 Git Bash 替代 PowerShell 作为 DSH Shell 工具

前言

在 Windows 上跑 DeepSeek Harness(DSH)时,默认 shell 工具往往走 PowerShell:命令经 pwsh 执行,引号、反斜杠、$env: 变量和代码页行为与 Linux/macOS 上的 bash 不一致。模型按 POSIX 习惯写的一行命令,容易在转义或编码上踩坑。

社区插件 dsh-mingw(目录页 scorpiour/dsh-mingw)把 Windows 上新会话里的 shell 工具换成 Git for Windows 自带的 MinGW64 bash,命令通过 bash -c 执行,语义与沙箱机制仍沿用 DSH 的 @deepseek-ai/dsh-bash-sandbox。下面介绍它的定位、安装方式和注意点。

这是什么

  • 维护者:Scorpiour
  • 分类:客户端(社区插件目录)
  • 一句话:在 Windows 上让 DSH 的 shell 工具使用 Git Bash(MinGW64),而不是 PowerShell。
  • 包名:@local/dsh-win-mingw(当前发布版本 0.1.1,MIT 许可证)

Git for Windows 已内嵌 MinGW64 用户态(bash、coreutils、git 等),插件默认使用 C:\Program Files\Git\bin\bash.exe,并把该目录置于子进程 PATH 最前。不需要单独安装 MinGW、MSYS2,也不必把 bash 加入系统 PATH。

核心功能

Shell 行为

装好后,新建会话里模型看到的是 bash 工具,而不是 pwsh。与 PowerShell 路径相比,README 中强调的差异包括:

  • 引号、反斜杠、$、反引号、换行按 POSIX/bash 规则解析;
  • stdout / stderr / 重定向文件为 UTF-8 字节;
  • 托管变量包括 $DSH_HOME、$DSH_PROFILE、$DSH_PROFILE_DIR、$DSH_SESSION_ID、$DSH_SHELL;
  • 每次调用仍是新进程;工作目录、超时、后台 job、输出截断和沙箱行为继承 DSH 既有 bash 沙箱机制。

uname -s 会显示 MINGW64_NT-...,uname -o 为 Msys,对应 Git for Windows 内嵌环境。

与宿主 PowerShell 的关系

安装通过 cordis.patch.yml 改写 standard、ptc、cordis 三个 preset 的 shell 挂载方式:在 Windows 上用隔离的 group 挂载 MingwBashExecutor 与 bash 工具,不替换宿主由 @deepseek-ai/dsh-pwsh-sandbox 提供的 PowerShell executor。minimal preset(持久 pwsh)未改动;已有会话不会热切换,需新建会话才走 MinGW bash。

Bash 自动探测

探测顺序(资料原文):常见 Git 安装目录 → git --exec-path 反推 Git 根目录 → PATH 中的 bash.exe(会跳过 C:\Windows\System32\bash.exe,并用 uname 确认是 MinGW/MSYS)。便携版 Git、scoop、非标准目录可通过 git --exec-path 或环境变量 MINGW_BASH 指定。

安装前提

  1. Windows 操作系统。
  2. 已安装 Git for Windows(默认路径 C:\Program Files\Git)。
  3. DSH 0.2.1-rc.2 系列(engines.dsh 限定为 >=0.2.1-rc.2 <0.3.0)。

插件以当前 DSH 进程权限运行;安装前建议在 GitHub 仓库阅读源码与 LICENSE,确认符合你的环境策略。

安装与启用

从 GitHub 安装(推荐)

在 DSH 插件管理器中:

plugin_manager action=install_bundle target=github:Scorpiour/dsh-mingw

或从 CLI:

dsh plugin --profile web add github:Scorpiour/dsh-mingw

需要固定发布版本时指定 tag:

dsh plugin --profile web add github:Scorpiour/dsh-mingw#v0.1.1

从本地目录安装(开发)

插件管理器:

plugin_manager action=install_bundle target=<克隆目录>

CLI:

dsh plugin --profile web add <克隆目录>

经过上面的步骤,现有会话保持原样;只有新建会话才会使用 MinGW bash。若安装后出现 preset 模块导入失败(UI 显示 never start),README 建议重启 DSH 一次(不必重装),再新建会话。

验证

新建会话后,让模型或自己在 shell 工具中运行:

uname -o; pwd; printf '中文\n'; echo "$DSH_PROFILE"
command -v pwsh || echo no-pwsh
command -v bash

期望结果(与 README 一致):

  • uname -o 输出 Msys(不是 GNU/Linux);
  • pwd 为当前目录的 POSIX 形式(例如 /e/Develop/dsh-win-mingw);
  • 中文 正常输出;
  • DSH_PROFILE 为当前 profile;
  • pwsh 不存在(或 no-pwsh);
  • bash 解析到 Git/MSYS 路径。

配置

执行器配置在 cordis.patch.yml 的 mingw-shell 下,可用字段:

字段 默认 含义
bashPath 自动探测 显式指定 bash.exe,或包含 bash.exe 的目录
verifyBash true 是否用 uname 验证选中 shell 为 MinGW/MSYS
pathPrepend [] 追加到子进程 PATH 的 Windows 目录(位于 bash 目录之后)

优先级:bashPath > 环境变量 MINGW_BASH > 常见 Git/MSYS2 安装位置 > git --exec-path 反推 > PATH。显式指定的 bash 不可用时会直接报错,不会静默换用其他解释器。

Git 装在非标准位置时,可在 PowerShell 中设置(改环境变量无需重装 bundle):

$env:MINGW_BASH = 'D:\PortableGit\bin\bash.exe'

适用场景与注意

适合谁

  • 主要在 Windows 上使用 DSH,希望模型执行的 shell 与 Unix 习惯一致(管道、重定向、UTF-8 文本)。
  • 已安装 Git for Windows,不想为 DSH 单独维护 MSYS2 或全局 bash PATH。

限制与排错(摘自 README)

  • workspace-write 沙箱与 MinGW/Git /tmp、Windows ACL 的组合尚未端到端验证;默认 profile 为 danger-full-access,若切换 workspace-write 后临时文件写入失败,可先切回或向维护者反馈。
  • 命令里显式调用 powershell / cmd /c 仍由它们执行。
  • minimal preset 仍为持久 pwsh。
  • 依赖 @deepseek-ai/dsh-bash-sandbox 等当前 API;DSH 大版本升级后宜先跑仓库内测试与 node scripts/build-patch.mjs,再更新插件。

DSH 生态强调「一切皆插件」;SkillHub 插件目录 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-mingw 把 Windows 上新会话的 DSH shell 工具接到 Git for Windows 自带的 MinGW64 bash,在保留 bash 沙箱语义的前提下避开 PowerShell 的 cmdlet 与转义差异。安装命令以仓库 README 为准;固定版本可使用 #v0.1.1 tag。

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

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

小夜