前言¶
在 Windows 上給 DSH 智能體配終端時,常見做法是固定一種後端:要麼全程 Git Bash,要麼全程 PowerShell,要麼單獨走 WSL。真實任務裏卻經常在同一輪對話裏混用——POSIX 管道適合 grep/sed,PowerShell 適合查註冊表或 .NET,Linux 工具鏈又更適合 WSL 裏的發行版環境。若只能在設置裏選「默認終端」,模型無法按命令語法逐次切換,容易寫出在錯誤 shell 裏跑不通的腳本。
dsh-multi-shell 是社區維護者 deepseekv41flash 發佈的 DSH 工作流類插件(npm 包名 dsh-multi-shell,當前 README 對應版本 0.1.2,MIT 許可證)。它只向宿主註冊一個名爲 shell 的工具,但在每次調用時通過參數 shell 讓模型在 Git Bash(默認)、PowerShell、WSL 之間自行選擇後端,並在 profile 裏用普通對象配置覆蓋超時、路徑探測等默認值。下文按「是什麼 → 能力 → 安裝 → 用法 → 注意」說明,事實均來自 GitHub 倉庫 README 與 npm 包說明。
這是什麼¶
一句話:dsh-multi-shell 把「跑 shell 命令」收斂成單一工具面,把「用哪種 Windows/Linux 執行環境」交給模型在每次調用裏決定。
與同屬終端方向的 dsh-bash-terminal 相比,README 只強調兩點差異:
| dsh-bash-terminal | dsh-multi-shell | |
|---|---|---|
| 選後端的人 | 用戶在設置頁選「默認終端」,模型不能改 | 模型通過 shell 參數逐次選擇 |
| 跨 DSH 版本 | peerDependencies 聲明較窄的版本範圍 |
全部 peerDependencies: "*,模塊內無版本門控;可選服務按調用解析,缺一項隻影響單次調用 |
插件本體是純 ESM、零構建:package.json、lib/、cordis.patch.yml 即可運行;Node 要求 >=20。
核心功能¶
單一 shell 工具與參數¶
模型可見的主要參數如下(必填與默認值以 README 爲準):
| 參數 | 必填 | 說明 |
|---|---|---|
command |
是 | 命令正文;語法須匹配所選後端 |
description |
是 | 5–10 詞的主動語態說明(供 UI 展示) |
shell |
否 | gitbash(默認)/ powershell / wsl |
distro |
否 | 僅與 shell=wsl 同用;WSL 發行版名,缺省爲系統默認 |
workdir |
否 | 工作目錄;相對路徑按會話目錄展開 |
timeoutMs |
否 | 前臺超時(毫秒),默認 120000、上限 600000 |
run_in_background |
否 | 後臺任務,返回 job id,配合 job_output / job_kill |
sandbox_permissions + justification |
否 | 沙箱升級,僅 powershell 後端有意義,經 ctx.approval 審批 |
三個後端實際執行的 argv 概要:
- gitbash:
<Git>\bin\bash.exe -lc <command>(POSIX;$VAR;PATH 含/usr/bin、/mingw64/bin) - powershell:
pwsh -NoLogo -NoProfile -NonInteractive -Command <UTF-8 前導 + command>;前導固定控制台與管道爲 UTF-8,並帶LanguageMode守衛,避免只讀沙箱下每次往 stderr 打兩條InvalidOperation - wsl:
wsl [-d <distro>] -e bash -lc <command>;DSH_*經WSLENV傳入
非零退出在輸出末行以 [exit code: N] 標記;超時以 [timed out after Nms] 開頭且仍帶退出碼;輸出超過 64 KiB 會截尾並給出完整 spill 文件路徑。
沙箱與審批¶
- PowerShell:在
read-only/workspace-write下經ctx.sandbox.confine包裝 argv(fail-closed);無可用 provider 時拒絕執行,不會裸跑。 - Git Bash / WSL:README 說明 DSH 的 Windows ACL 受限令牌 runner 無法穩定啓動 Cygwin/MSYS2 bash,WSL 亦僅爲進程隔離、
/mnt/c仍可寫,故這兩路不隔離;受限會話下結果中會追加模型可見的[sandbox: …]提示行。 - 沙箱升級:
sandbox_permissions只對powershell開放;對 gitbash/wsl 傳該參數會報錯。
工具描述中還寫入了宿主機啓用 Sudo for Windows 內聯模式 時,從 gitbash 提權跑管理員 PowerShell 的模板(每次 UAC、無憑據緩存;不要用 UI 自動化點 UAC)。
可配置項¶
在 profile 的 patch 裏可按需覆蓋(普通對象,無 schemastery schema):
- id: tool-multi-shell
config:
defaultShell: gitbash # 模型不傳 shell 時的後端
pwshPath: '' # 留空則自動探測
gitBashPath: ''
wslPath: ''
timeoutMs: 120000
maxTimeoutMs: 600000
maxOutputBytes: 65536
maxSpillBytes: 67108864
graceMs: 3000
enableRunInBackground: true
apply() 啓動時會校驗數值配置(須爲正有限數等),非法值在啓動階段報錯並指明字段名。
README 記載在 DSH 0.2.1-rc.4 / desktop-next 2.0.21-next 環境下做過多項驗證(默認 gitbash、pwsh UTF-8、WSL 路徑映射、超時、後臺 job、沙箱探針、審批 allow-once/rejected、sudo 模板等);未驗證項(如審批 cancelled、workspace-write 升級後的實際執行在特定宿主佈局下受限)也在 README 中單獨列出。
安裝與啓用¶
從 npm 安裝到某個 profile(把包加入該 profile 並登記到 bundles,重啓 DSH 後生效):
dsh plugin --profile desktop add dsh-multi-shell
# 然後把 "dsh-multi-shell" 加進該 profile package.json 的 dsh.profile.bundles 數組
# (或用 DSH 設置頁的插件管理器安裝,它會同時寫 dependencies + bundles)
npm 包地址:https://www.npmjs.com/package/dsh-multi-shell。
回滾時從 profile 的 dsh.profile.bundles 與 dependencies 移除 dsh-multi-shell 並刪除 junction;若要恢復 dsh-bash-terminal,需去掉 cordis.patch.yml 裏對 tool-bash-terminal 的 disabled: true。兩個插件都註冊 shell 工具名,同時只能啓用一個。
社區目錄頁(與 DeepSeek / 幻方無官方從屬關係):https://www.skillhub.cn/plugins/deepseekv41flash/dsh-multi-shell。
典型用法¶
用法即模型(或你在調試時)對 shell 工具的調用約定,沒有單獨的 CLI 子命令。
1、默認 Git Bash 跑 POSIX 命令(不傳 shell 或 shell: gitbash):
{
"command": "echo \"$PATH\" | head -c 80",
"description": "Show PATH prefix in Git Bash"
}
2、需要 PowerShell 語法或 .NET 時顯式選後端:
{
"command": "Get-Location | Select-Object -ExpandProperty Path",
"description": "Print current directory via pwsh",
"shell": "powershell"
}
3、在指定 WSL 發行版裏跑 Linux 命令(distro 僅在與 wsl 同用時有效):
{
"command": "uname -a && pwd",
"description": "Check Linux kernel and cwd in WSL",
"shell": "wsl",
"distro": "Debian",
"workdir": "C:\\Users\\Admin\\project"
}
4、長時間任務可設 run_in_background: true,再用宿主提供的 job_output / job_kill 跟蹤;前臺命令用 timeoutMs 控制上限(默認 120000 ms)。
5、只讀沙箱下若 PowerShell 寫盤被拒,可按 README 流程攜帶 sandbox_permissions 與 justification 請求升級;用戶拒絕後應停止繞行。gitbash/wsl 不支持該升級參數。
適用場景與注意¶
適合誰:主要在 Windows 上跑 DSH、又希望模型在同一會話裏按命令性質切換 Git Bash / pwsh / WSL 的開發者;願意接受 gitbash 與 wsl 路徑不受 DSH ACL 沙箱同等約束、並在輸出裏看到明確 [sandbox: …] 提示的場景。
務必知曉:
- 插件以當前 DSH 進程權限執行命令;安裝前請自行查看 GitHub 源碼 與 MIT 許可證。
- 與
dsh-bash-terminal工具名衝突,切換插件前按 README 處理 bundle 與disabled標記。 peerDependencies爲*,意在減少宿主小版本升級時的安裝門控;仍建議在目標 DSH 版本上按 README「已驗證」表做一次冒煙。- 社區插件目錄 skillhub.cn 是獨立生態站點,不等同於官方應用商店。
結尾¶
dsh-multi-shell 用「一個 shell 工具 + 按次 shell 參數」把 Windows 上常見的三種執行面交給模型調度,並在 PowerShell 側保留沙箱 confine、UTF-8 前導與可選審批升級;與固定默認終端的方案相比,差在控制權在模型側、版本依賴更寬。進一步瞭解可打開 SkillHub 目錄頁 與 GitHub 倉庫。