解决Claude Code在Windows执行shell命令时无限挂起的问题
解决Claude Code在Windows执行shell命令时无限挂起的问题
我最近在Windows上用Claude Code时遇到了一个巨头疼的问题:每次执行ls、find、grep或者./gradlew这类shell命令,都会直接卡住,等好几分钟都没输出,只能手动按x杀掉shell进程,或者干脆重启Claude Code。更糟的是,后台还会不断积累僵死的shell进程,最多的时候堆了9个以上,看着都闹心。
我的环境背景
- Windows 10/11 系统
- 已安装Git for Windows
- Claude Code v2.x(通过npm全局安装)
- 项目文件都放在D盘
- 公司统一用Bitdefender Endpoint Security做杀毒软件
具体症状
- 执行
ls "D:\Projects\..."这类路径命令,5分钟以上完全没输出 find . -name "*.java"直接无限挂起,动都不动- 运行
./gradlew assembleDebug会立即冻结 - 用
/init命令会 spawn 多个bash shell,全部卡死 - 后台僵死的shell进程越积越多,清理都麻烦
我踩过的无效坑
- 重装Claude Code(没用,问题依旧)
- 分别从Git Bash、PowerShell启动Claude Code(换启动环境也没解决)
- 尝试给Windows Defender加排除项(但公司权限卡死了,根本加不了)
- 在命令前加
timeout前缀(完全没效果)
折腾了一圈这些方法都白搭,直到我挖到了真正的根因,才彻底把问题解决。
根因分析
哪怕你从PowerShell启动Claude Code,它内部其实会默认用Git Bash(MSYS)——只要你装了Git for Windows。Claude Code选择内部shell的优先级是这样的:
- 优先读
~/.claude/settings.json里的shellPath配置(我这里是空的) - 其次看系统的
SHELL环境变量(我的指向了Git Bash) - 最后在PATH里找第一个
bash.exe(我的PATH里刚好有C:\Program Files\Git\usr\bin\bash.exe)
因为我没设置shellPath,Claude Code自动从PATH里捡了Git Bash用,这就捅了两个娄子:
- MSYS路径转换拖垮性能:每次访问D盘路径时,
D:\path都会被强制转换成/d/path,在大目录下这种转换会产生巨量的额外开销,直接导致命令卡死。
最终解决办法
只需要修改Claude Code的配置文件,强制它用PowerShell作为内部shell就行:
- 打开
C:\Users\<你的用户名>\.claude\settings.json(把<你的用户名>换成你自己的Windows用户名) - 将文件内容替换成下面的配置(注意反斜杠要转义):
{ "shellPath": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", "env": { "SHELL": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" } }
- 保存文件后重启Claude Code
这样设置后,Claude Code会直接用PowerShell作为内部shell,彻底绕开Git Bash的路径转换问题,命令终于能正常跑起来了!




