← Agent 目录 / 通用指南
给任意 Agent 接上 niubash
agent 怎么选 shell 是有规律的——摸清它的探测机制,就能接线。 你的 agent 从不在「你正用的 shell」里跑命令:它自己挑一个,而在 Windows 上 这个挑选只由四种探测机制决定。下面把它们逐一拆开,再给一条三步决策流, 目录里没列过的 agent 也能照此接上。
已适配 24 个 AI agent——15 个开箱即用,另有 38 个候选在调研管道
① 我用 Claude Code / Codex / Cursor…
去目录挑你的 agent——开箱可换与 VSCode 家族都有换壳脚本、验证命令与回滚方法。
去目录挑 →② 我的 agent 不在列表
本页就是通用接线指南:四种探测机制 + 三步决策流,往下看即可。
开始接线 ↓③ 让 agent 自己装
AI 门户:把一键安装提示词粘给你的 agent,它自己完成安装与接线。
打开 AI 门户 →四种探测机制
出自 agents.md「The four mechanisms」。前三种都能由你接线; 第四种是所有裸名调用的硬伤,也是另外三种存在的原因。 每行的「怎么接线」落到第 3 步决策流 里的对应可复制块。
| 机制 | 覆盖面 | 怎么接线 |
|---|---|---|
| ① $SHELL · POSIX 约定 |
读进程环境的 agent——最大的一类,含所有 POSIX 风格 CLI
(opencode 是纯样本:二进制里 0 处 niu、无 shell 配置项,
$SHELL 就是全部机制)。
niu 会话内自动生效:niu 导出 SHELL=<niu.exe 路径>。
但 $SHELL 不持久化——从开始菜单 / Explorer 启动的同一个 agent 拿到的是空值。 | 在 niu 里启动 agent(第 3 步·第 1 步试跑),或把 SHELL 写入用户环境变量持久化(块 a)。 |
| ② per-agent 显式配置 |
提供 shell 配置文件字段 / CLI 旗标的 agent:
Zed(terminal.shell.program)、Claude Code
(CLAUDE_CODE_GIT_BASH_PATH)、VS Code 家族
(automationProfile)、DSH(profile 插件)。
读配置项的机制与启动方式无关——设一次,永久生效。 | 先按第 4 节自查法找到它的 shell 设置项,再指到 niu.exe 或安装器占位的 bash.exe(块 b 是 VS Code 家族的通用片段)。 |
| ③ Git for Windows 探针 |
硬编码 Git 路径、或从 PATH 上的 git 反推的 agent:
Claude Code(先扫 C:\Program Files\Git 与 x86 目录,再从 git 反推)、
VS Code 全家(Copilot / Windsurf / Trae / ZCode + Cline、Roo Code、Kilo Code、Continue 等扩展)。
探的是固定位置:C:\Program Files\Git\bin\bash.exe 等。 | niubash 安装器已在该路径占位 bash.exe(含 x86 候选与 sh.exe),需管理员跑一次(块 c 验证)。 |
| ④ 裸名解析 |
把 bash / sh 裸名丢给 PATH / ComSpec / PATHEXT 解析的调用方。
硬伤:CreateProcess 的搜索序里系统目录(System32)排在 PATH 之前——裸 bash 永远先命中
C:\Windows\System32\bash.exe(WSL)。详见 agents.md「Why PATH cannot win against System32」。 | 用户 PATH 抢不过 System32:要么给完整路径指到 Git 探针(并入③),要么让调用方改用 sh(System32 没有 sh 同名者)。 |
接线决策流(三步)
第一步 · 永远先试「在 niu 会话里启动」
这是唯一「通常直接就成」的做法:niu 导出 SHELL=<niu.exe 路径>,
遵循 POSIX 约定的 agent 原样采用。agents.md 的作者就这么跑:
进程树 powershell.exe ← niu.exe ← opencode.exe,
而 opencode 的 shell 选择器就是
process.env.SHELL ?? which("bash") ?? "/bin/sh"。
成本为零,先试它。
# 1) 进入 niu 会话(SHELL 在这里导出,指向 niu.exe)
niu
# 2) 在 niu 会话里启动你的 agent(示例):
opencode # 或 codex / 任意 CLI agent
# 3) 让 agent 跑下面这条验证命令,再按第 2 步对号入座
# echo "SHELL=$SHELL"; uname -s; uname -a echo "SHELL=$SHELL"; uname -s; uname -a
但 $SHELL 不持久化:它只存在于 niu 会话的后代进程里。
从开始菜单 / Explorer 启动的同一个 agent 拿到空 $SHELL,
回落 which("bash")——在装了 WSL 的机器上解析到
C:\Windows\System32\bash.exe,命令就跑在 Linux 里。
所以还需要下面两步把结果钉住。
第二步 · 看结果对号入座
把 agent 跑出的三行输出对照下面的签名表(默认收起,点开「原理」即看):
原理:它怎么选 shell——uname 签名表
签名表用人话读:看到 MSYS_NT 就是已经在 niu 里(成功);
MINGW64 是掉进了 Git Bash;Linux 是掉进了 WSL;
命令不存在、$SHELL 为空是还停在 PowerShell/cmd。
| 你看到 | 实际 shell | 下一步 |
|---|---|---|
uname -s = MSYS_NT-…,且 uname -a 结尾 x86_64 Msys | niu(winuxcmd shim) | 成功 $SHELL 已指向 niu.exe;要跨启动方式钉住就补块 a。
MSYS_NT 是我们有意伪装的兼容人格(uname 报 MSYS 让老脚本以为在 MSYS 里),
并非真的 MSYS 运行时——niu 内部没有 MSYS。
|
uname -s = MINGW64_NT-…,MSYSTEM=MINGW64 | Git Bash(Git for Windows 自家运行时) | 被探针型机制抢了:走机制③(占位路径生效后,探针改打 niubash 的 bash.exe)或机制②(显式指定),也可持久化 $SHELL 兜底。 |
uname -s = Linux | WSL——agent 回落 which("bash") 命中 System32\bash.exe | 中招最深的静默错壳:走机制②或机制③,并用机制①(块 a)防回落。 |
uname 不存在,$SHELL 为空 | PowerShell 或 cmd(用 $PSVersionTable.PSVersion vs %COMSPEC% 区分) | 安全但不兼容 bash 语法:走机制②(VS Code 家族即块 b)。 |
这套签名检查同样出现在 Cursor 官方支持帖里:修复的判定就是
uname -a 结尾从 microsoft-standard-WSL2 变成
MINGW64_NT-…——换成 niu 的目标则是 MSYS_NT-…(结尾 x86_64 Msys)。
第三步 · 按机制给配置(三段可复制块)
# 把 SHELL 写入用户环境变量(安装器同款做法:一处注册表值,免提权)
# 路径按实际安装位置调整;默认装在 %LOCALAPPDATA%\Programs\Niubash
[Environment]::SetEnvironmentVariable('SHELL', "$env:LOCALAPPDATA\Programs\Niubash\niu.exe", 'User')
# 撤销(与安装器卸载语义一致):
# [Environment]::SetEnvironmentVariable('SHELL', $null, 'User')
# 注意:只对之后新开的进程生效——写完请重开终端 / agent
安装器本身也会把 SHELL 写进用户环境(卸载时移除)——这是
agents.md「Recommended order of work」的第 1 项:一个注册表值、无需提权,
覆盖最大一类 agent(所有 POSIX 风格 CLI),并让 $SHELL
不再依赖启动方式。上面命令是同款做法的手动版。
// VS Code 家族 settings.json(VS Code / Windsurf / Trae / ZCode,以及走编辑器
// 终端或 automation profile 的 Cline、Roo Code、Kilo Code、Continue 等扩展)
// path 换成你的实际安装路径,默认 %LOCALAPPDATA%\Programs\Niubash\niu.exe:
"terminal.integrated.automationProfile.windows": {
"path": "C:\\Users\\<你的用户名>\\AppData\\Local\\Programs\\Niubash\\niu.exe",
"args": []
}
通过 automation profile 外呼命令的 agent 会继承该配置(VS Code 家族的显式控制法)。
占位路径之外,把 profile 指到 niu.exe 是跳过 bash.exe 启动器一跳的写法。
Cursor 例外:Cursor 的 IDE agent 无视
terminal.integrated.defaultProfile.windows 与
automationProfile.windows,仍跑 PowerShell(变通是开启
Legacy Terminal Tool 设置);其 Agent CLI 更是硬编码 PowerShell。详见
Cursor 详情页。
# 安装器的可选提权步骤(管理员跑一次)会放置机制③所需的占位:
# C:\Program Files\Git\bin\bash.exe <- Claude Code / VS Code 家族硬编码探针 1
# C:\Program Files (x86)\Git\bin\bash.exe <- 第二候选路径
# C:\Program Files\Git\bin\sh.exe <- 要求 bash 旁边有 sh 的工具
# 验证占位是否到位(第一行应输出 True;第二行应输出 MSYS_NT-...):
Test-Path 'C:\Program Files\Git\bin\bash.exe'
& 'C:\Program Files\Git\bin\bash.exe' -c 'uname -s'
这几个文件由安装器的可选提权步骤放置——需要管理员权限跑一次
(Program Files 不是用户 PATH 能写的地方),属「一次成本、全家受益」:
Claude Code 与 VS Code 家族的硬编码探针从此都打到 niubash 的启动器上。
该 bash.exe 不是 niu 本体,而是启动 niu.exe 子进程的启动器
(agent → bash.exe → niu.exe):多花约 17.6 ms/次 -c
调用(niubash#377);历史上的「每条命令闪一个 console 窗口」问题(niubash#379)
已在 rubash#668 修复,随下一次 rubash 升级发布——升级后可顺手验证闪窗消失。
目录没列的 agent?自查三问
已核验名单只有九个,而 agent 生态远不止。大多数 agent 的 shell 探测 藏在三处之一——按顺序问:
-
一问设置
翻它的文档、设置界面、配置文件 schema,搜
shell、terminal、bash、profile字样;--help里找--shell类旗标。 已核验 agent 的可配置点长这样:Zed →terminal.shell.program; Claude Code → settings.json 里的CLAUDE_CODE_GIT_BASH_PATH; VS Code 家族 →terminal.integrated.automationProfile.windows; DSH →dsh plugin --profile web add @cmx666/dsh-niu-bundle@<版本>。 找到即归入机制②,指到niu.exe或占位的bash.exe。 -
二问代码
读得到源码或二进制的话,搜
detect/shell字样。真实样本: Cursor 的detectShellType()、Gemini CLI 的getShellConfiguration()、 Codex 的codex-rs/shell-command/src/shell_detect.rs、VS Code 家族藏在app.asar里的探针数组(硬编码C:\Program Files\Git\bin\bash.exe与 x86 候选,再从which("git")反推)。看它读什么—— 环境变量→机制①;配置字段→机制②;硬编码 Git 路径 / git 反推→机制③; PATH 裸名→机制④——然后回第 2 节的表格接线。 -
三问死活
如果它无条件返回 PowerShell(Gemini CLI 现状:
getShellConfiguration()在 Windows 上无 bash 分支),或硬编码 PowerShell(Cursor CLI 现状:$SHELL/$COMSPEC都被无视)——配置救不了, 归为「暂不支持」,等上游开放 shell 路径再接。
查明白了?欢迎提 PR把结论补进 /agents/ 目录 (agent 名、机制归类、配置方法、验证输出四件套): github.com/unixwin/unixwin.dev ↗。 agents.md 的「未核验」名单还很长——Amazon Q Developer CLI、Goose、Amp、OpenHands、 Devin……每一份实测侦察都算贡献。
接线时别干这两件事(agents.md「Two things not to do」):
一是别把 winuxcmd\usr\bin 加进 PATH——几百个名字,其中不少与 System32 撞名;
二是别去替换 C:\Windows\System32\bash.exe。
Known traps · 四条
-
MSYSTEM 为空
niu 会话里
MSYSTEM是空的。想靠它嗅探 MSYS 的工具(例如 Gemini CLI 社区提案的修法)根本看不见 niu;自己动手设它属于实验性行为——没测过, 还会改变其他 MSYS 感知工具的行为。 来源:agents.md · Known traps 第 1 条 -
uname 报 MSYS_NT 是有意兼容
winuxcmd shim 的
uname会报MSYS_NT-…——这是为了兼容 故意设计的:凡按uname分支的工具都会把宿主判成 MSYS, autotools 一类工具能明确观察到这一点。别当 bug 修。 换言之:MSYS_NT 是我们有意伪装的兼容人格(uname 报 MSYS 让老脚本以为在 MSYS 里), 并非真的 MSYS 运行时——niu 内部没有 MSYS。 来源:agents.md · Known traps 第 2 条 -
WSL bash 静默跑 Linux
解析到 Windows 自带 WSL 启动器的
bash会启动 Linux 里的 bash, 全程没有任何报错——agent 只是安静地把你的命令跑在了另一个操作系统上。 这就是第二步里uname -s = Linux的由来。 来源:agents.md · Known traps 第 4 条 -
System32 搜索序
裸名
bash交给 CreateProcess 时搜索序是:应用目录 → 当前目录 → 系统目录 → Windows 目录 → PATH。系统目录永远排在 PATH 前面,所以用户级 PATH 抢不过System32\bash.exe——实测subprocess(['bash', ...])就这样落进 WSL,而cmd /c bash与 PowerShell& bash由 shell 自行解析、PATH 说了算。 来源:agents.md · Why PATH cannot win against System32
来源
-
事实唯一来源:Coding agents on Windows, and the shell they run ↗
(niubash 仓库
docs/src/agents.md线上版)——本页四机制、验证签名表、 路径归属与全部陷阱均出自该文。 - 该文核验环境:niu 1.4.0、niu-git 2.55.0.5(flat 布局)、Git for Windows 2.50.1、装有 WSL2 发行版;核验日期 2026-10-16。
- ← 返回 Agent 目录:opencode、Claude Code、Codex、VS Code 家族、 Zed、DSH、Cursor、Gemini CLI、Aider 各有专用换壳页。