[BUG] Claude Code crash with "Error: No suitable shell found." in Win 11 with Git Bash
Environment
- Platform (select one):
- [ v] Anthropic API
- [ ] AWS Bedrock
- [ ] Google Vertex AI
- [ ] Other: <!-- specify -->
- Claude CLI version: <!-- output of
claude --version--> 1.0.55 - Operating System: <!-- e.g. macOS 14.3, Windows 11, Ubuntu 22.04 --> Windows 11
- Terminal: <!-- e.g. iTerm2, Terminal App --> Git Bash
Bug Description
Claude Code crash after installation
Steps to Reproduce
- install CC with npm
- activate CC with subscription
- skip steps for onboarding
- see error below
or
- run bash command
claude - see same error
Expected Behavior
Claude code can be used
Actual Behavior
Claude code crash
Additional Context
<!-- Add any other context about the problem here, such as screenshots, logs, etc. -->
full error log
stalled and the SHELL environment variable set.";throw v1(new Error(J)),new Error(J)}return W}var DhQ=async(A)=>{let B=A.includes("zsh")?"zsh":A.includes("bash")?"bash":"sh";return fA(Creating shell snapshot for ${B} (${A})),new Promise(async(Q)=>{try{let I=vl0(A);if(!ngQ(I)){fA(Shell config file not found: ${I}),Q("");return}let D=QhQ(A);rgQ(A,["-c","-l",D],{env:{...process.env.CLAUDE_CODE_DONT_INHERIT_ENV?{}:process.env,SHELL:A,GIT_EDITOR:"true",CLAUDECODE:"1"},timeout:BhQ,maxBuffer:1048576},async(G,Z,F)=>{if(G)fA(Shell snapshot creation failed: ${G.message}),fA(stderr: ${F}),v1(new Error(Failed to create shell snapshot: ${F})),E1("shell_snapshot_failed",{stderr_length:F.length}),Q("");else{let Y=Z.length;if(fA(Shell snapshot created successfully (${Y} bytes)),Zg())try{let W=Date.now(),J=Math.random().toString(36).substring(2,8),C=As1(t9(),"shell-snapshots"),X=As1(C,snapshot-${B}-${W}-${J}.sh);agQ(C,{recursive:!0}),sgQ(X,Z,"utf8"),fA(Debug: Shell snapshot written to ${X})}catch(W){fA(Failed to write debug snapshot: ${W})}Q(Z)}})}catch(I){fA(Unexpected error during snapshot creation: ${I}),v1(I instanceof Error?I:new Error(String(I))),E1("shell_snapshot_error",{}),Q("")}})};async function GhQ(){let A=IhQ(),B=await DhQ(A);return{binShell:A,snapshotContent:B}}var Qs1=U0(GhQ);async function ZhQ(A,B,Q,I=!1,D,G){let Z=Q||AhQ,{binShell:F,snapshotContent:Y}=await Qs1();if(D)F=D,Y="";let W=Math.floor(Math.random()65536).toString(16).padStart(4,"0"),J=pX1.tmpdir();if(q9()==="windows")J=Wr(J);let C=${J}/claude-${W}-cwd,X=ae.default.quote([A,"<","/dev/null"]);if(F.includes("bash")&&!I){let z=A.split(/(?<!\|)\|(?!\|)/);if(z.length>1)X=ae.default.quote([z[0],"<","/dev/null","|",z.slice(1).join("|")])}if(I)A=fl0(A),X=ae.default.quote([A,"<","/dev/null"]);let V=()=>{};if(I){let z=kl0(X);X=z.finalCommand,V=z.cleanup}let K=["source <(cat)",eval ${X},pwd -P >| ${C}].join(" && "),H=bl0();if(B.aborted)return Sl0();try{let z=ta1(A),q=F;if(q9()==="windows")q=Sx1();let M=ogQ(q,["-c","-l",K],{env:{...process.env,SHELL:F,GIT_EDITOR:"true",CLAUDECODE:"1",...I?z.env:{}},cwd:H,detached:!0});M.stdin.end(Y);let L=Pl0(M,B,Z,G);return L.result.then(async(T)=>{if(T&&!T.backgroundTaskId)try{pX(igQ(C,{encoding:"utf8"}).trim(),H)}catch{E1("shell_set_cwd",{success:!1})}}).finally(()=>V()),V=()=>{},L}catch(z){return fA(Shell exec error: ${z instanceof Error?z.message:String(z)}),V(),{background:()=>null,kill:()=>{},result:Promise.resolve({code:126,stdout:"",stderr:z instanceof Error?z.message:String(z),interrupted:!1})}}finally{V()}}function bl0(){return lFA()}function pX(A,B){let Q=tgQ(A)?A:egQ(B||b1().cwd(),A);if(!b1().existsSync(Q))throw new Error(Path "${Q}" does not exist);let I=b1().realpathSync(Q);pFA(I),E1("shell_set_cwd",{success:!0})}var FhQ=ZhQ;function gl0(){return FhQ}function lA(){try{return bl0()}catch{return N9()}}var se=1000,re=60;function O2(A,B,Q={timeout:10rese,preserveOutputOnError:!0,useCwd:!0}){return Y8(A,B,{abortSignal:Q.abortSignal,timeout:Q.timeout,preserveOutputOnError:Q.preserveOutputOnError,cwd:Q.useCwd?lA():void 0,env:Q.env,..."shell"in Q?{shell:Q.shell}:{}})}function Y8(A,B,Q={timeout:10rese,preserveOutputOnError:!0,maxBuffer:1e6}){let{abortSignal:I,timeout:D=10rese,preserveOutputOnError:G=!0,cwd:Z,env:F}=Q;return new Promise((Y)=>{try{YhQ(A,B,{maxBuffer:Q.maxBuffer,signal:I,timeout:D,cwd:Z,env:F,shell:"shell"in Q?Q.shell:q9()==="windows"?ZdA():void 0},(W,J,C)=>{if(W)if(G){let X=typeof W.code==="number"?W.code:1;Y({stdout:J||"",stderr:C||"",code:X,error:typeof W.code==="string"?W.code:String(X)})}else Y({stdout:"",stderr:"",code:1});else Y({stdout:J,stderr:C,code:0})})}catch(W){v1(W),Y({stdout:"",stderr:"",code:1})}})}function q5(A,B,Q=10rese){let I;if(B===void 0)I={};else if(B instanceof AbortSignal)I={abortSignal:B,timeout:Q};else I=B;let{abortSignal:D,timeout:G=10rese}=I;D?.throwIfAborted();let Z=WhQ(A,{env:process.env,maxBuffer:1e6,timeout:G,cwd:lA(),stdio:["ignore","pipe","pipe"]});if(!Z)return null;return Z.toString().trim()||null}function iX1(A){try{let B=String(A),Q=process.platform==="win32"?powershell.exe -NoProfile -Command "(Get-CimInstance Win32_Process -Filter \\"ProcessId=${B}\\").ParentProcessId":ps -o ppid= -p ${B},I=q5(Q,{timeout:1000});return I?I.trim():null}catch{return null}}function ul0(A){try{let B=String(A),Q=process.platform==="win32"?powershell.exe -NoProfile -Command "(Get-CimInstance Win32_Process -Filter \\"ProcessId=${B}\\").CommandLine":ps -o command= -p ${B},I=q5(Q,{timeout:1000});return I?I.trim():null}catch{return null}}import{join as nX1}from"path";import{homedir as dl0}from"os";var Is1=F1(Tx1(),1);import{constants as ml0}from"fs";function t9(){return process.env.CLAUDE_CONFIG_DIR??nX1(dl0(),".claude")}function xF(){if(b1().existsSync(nX1(t9(),".config.json")))return nX1(t9(),".config.json");return nX1(process.env.CLAUDE_CONFIG_DIR||dl0(),".claude.json")}var JhQ=U0(async()=>{let{code:A}=await O2("test",["-f","/.dockerenv"]);if(A!==0)return!1;return process.platform==="linux"}),ChQ=U0(async()=>{try{let A=new AbortController,B=setTimeout(()=>A.abort(),1000);return await Y9.head("http://1.1.1.1",{signal:A.signal}),clearTimeout(B),!0}catch{return!1}});async function Xd(A){try{let{cmd:B}=Is1.findActualExecutable(A,[]);try{return b1().accessSync(B,ml0.F_OK|ml0.X_OK),!0}catch{return!1}}catch{return!1}}var XhQ=U0(async()=>{let A=[];if(await Xd("npm"))A.push("npm");if(await Xd("yarn"))A.push("yarn");if(await Xd("pnpm"))A.push("pnpm");return A}),VhQ=U0(async()=>{let A=[];if(await Xd("bun"))A.push("bun");if(await Xd("deno"))A.push("deno");if(await Xd("node"))A.push("node");return A}),KhQ=U0(()=>{if(process.versions.bun!==void 0||process.env.BUN_INSTALL!==void 0)return!0;return!1}),cl0=U0(()=>{try{return b1().existsSync("/proc/sys/fs/binfmt_misc/WSLInterop")}catch(A){return!1}}),EhQ=U0(()=>{try{if(!cl0())return!1;let{cmd:A}=Is1.findActualExecutable("npm",[]);return A.startsWith("/mnt/c/")}catch(A){return!1}}),ll0=["pycharm","intellij","webstorm","phpstorm","rubymine","clion","goland","rider","datagrip","appcode","dataspell","aqua","gateway","fleet","jetbrains","androidstudio"],HhQ=U0(()=>{if(process.platform==="darwin")return null;try{let B=process.pid.toString();for(let Q=0;Q<10;Q++){let I=ul0(B);if(I){let G=I.toLowerCase();for(let Z of ll0)if(G.includes(Z))return Z}let D=iX1(B);if(!D||D==="0"||D===B)break;B=D}}catch{}return null});function zhQ(){if(process.env.CURSOR_TRACE_ID)return"cursor";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("/.cursor-server/"))return"cursor";if(process.env.VSCODE_GIT_ASKPASS_MAIN?.includes("/.windsurf-server/"))return"windsurf";let A=process.env.__CFBundleIdentifier?.toLowerCase();if(A?.includes("vscodium"))return"codium";if(A?.includes("windsurf"))return"windsurf";if(A?.includes("com.google.android.studio"))return"androidstudio";if(A){for(let B of ll0)if(A.includes(B))return B}if(process.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"){if(process.platform==="darwin")return"pycharm";return HhQ()||"pycharm"}if(process.env.TERM==="xterm-ghostty")return"ghostty";if(process.env.TERM?.includes("kitty"))return"kitty";if(process.env.TERM_PROGRAM)return process.env.TERM_PROGRAM;if(process.env.STY)return"screen";if(process.env.KONSOLE_VERSION)return"konsole";if(process.env.GNOME_TERMINAL_SERVICE)return"gnome-terminal";if(process.env.XTERM_VERSION)return"xterm";if(process.env.VTE_VERSION)return"vte-based";if(process.env.TERMINATOR_UUID)return"terminator";if(process.env.KITTY_WINDOW_ID)return"kitty";if(process.env.ALACRITTY_LOG)return"alacritty";if(process.env.TILIX_ID)return"tilix";if(process.env.WT_SESSION)return"windows-terminal";if(process.env.SESSIONNAME&&process.env.TERM==="cygwin")return"cygwin";if(process.env.MSYSTEM)return process.env.MSYSTEM.toLowerCase();if(process.env.ConEmuTask)return"conemu";if(process.env.WSL_DISTRO_NAME)returnwsl-${process.env.WSL_DISTRO_NAME};if(process.env.SSH_CONNECTION||process.env.SSH_CLIENT||process.env.SSH_TTY)return"ssh-session";if(process.env.TERM){let B=process.env.TERM;if(B.includes("alacritty"))return"alacritty";if(B.includes("rxvt"))return"rxvt";if(B.includes("termite"))return"termite";return process.env.TERM}if(!process.stdout.isTTY)return"non-interactive";return null}var W0={getIsDocker:JhQ,hasInternetAccess:ChQ,isCI:z6(!1),platform:["win32","darwin"].includes(process.platform)?process.platform:"linux",nodeVersion:process.version,terminal:zhQ(),getPackageManagers:XhQ,getRuntimes:VhQ,isRunningWithBun:KhQ,isWslEnvironment:cl0,isNpmFromWindowsPath:EhQ};function z6(A){if(!A)return!1;let B=A.toLowerCase().trim();return["1","true","yes","on"].includes(B)}function pl0(A){let B={};if(A)for(let Q of A){let[I,...D]=Q.split("=");if(!I||D.length===0)throw new Error(Invalid environment variable format: ${Q}, environment variables should be added as: -e KEY1=value1 -e KEY2=value2);B[I]=D.join("=")}return B}function Id(){return process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"us-east-1"}function UT(){return process.env.CLOUD_ML_REGION||"us-east5"}function Ds1(){return z6(process.env.CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR)}function il0(A){if(A?.startsWith("claude-3-5-haiku"))return process.env.VERTEX_REGION_CLAUDE_3_5_HAIKU||UT();if(A?.startsWith("claude-3-5-sonnet"))return process.env.VERTEX_REGION_CLAUDE_3_5_SONNET||UT();if(A?.startsWith("claude-3-7-sonnet"))return process.env.VERTEX_REGION_CLAUDE_3_7_SONNET||UT();if(A?.startsWith("claude-opus-4"))return process.env.VERTEX_REGION_CLAUDE_4_0_OPUS||UT();if(A?.startsWith("claude-sonnet-4"))return process.env.VERTEX_REGION_CLAUDE_4_0_SONNET||UT();return UT()}import{randomBytes as $hQ}from"crypto";var rl0=F1(QG1(),1);import{execSync as LhQ}from"child_process";var Gs1=v.enum(["local","user","project","dynamic"]),JG8=v.enum(["stdio","sse","sse-ide","http"]),Zs1=v.object({type:v.literal("stdio").optional(),command:v.string().min(1,"Command cannot be empty"),args:v.array(v.string()).default([]),env:v.record(v.string()).optional()}),UhQ=v.object({type:v.literal("sse"),url:v.string(),headers:v.record(v.string()).optional()}),whQ=v.object({type:v.literal("sse-ide"),url:v.string(),ideName:v.string(),ideRunningInWindows:v.boolean().optional()}),NhQ=v.object({type:v.literal("ws-ide"),url:v.string(),ideName:v.string(),authToken:v.string().optional(),ideRunningInWindows:v.boolean().optional()}),qhQ=v.object({type:v.literal("http"),url:v.string(),headers:v.record(v.string()).optional()}),Fs1=v.union([Zs1,UhQ,whQ,NhQ,qhQ]);var nl0=v.object({mcpServers:v.record(v.string(),Fs1)});var U$={allowedTools:[],history:[],mcpContextUris:[],mcpServers:{},enabledMcpjsonServers:[],disabledMcpjsonServers:[],hasTrustDialogAccepted:!1,ignorePatterns:[],projectOnboardingSeenCount:0,hasClaudeMdExternalIncludesApproved:!1,hasClaudeMdExternalIncludesWarningShown:!1},WW={numStartups:0,installMethod:void 0,autoUpdates:void 0,theme:"dark",preferredNotifChannel:"auto",verbose:!1,editorMode:"normal",autoCompactEnabled:!0,hasSeenTasksHint:!1,queuedCommandUpHintCount:0,diffTool:"auto",customApiKeyResponses:{approved:[],rejected:[]},env:{},tipsHistory:{},memoryUsageCount:0,parallelTasksCount:1,promptQueueUseCount:0,todoFeatureEnabled:!0,messageIdleNotifThresholdMs:60000,autoConnectIde:!1,autoInstallIdeExtension:!0},oe=["apiKeyHelper","installMethod","autoUpdates","theme","verbose","preferredNotifChannel","shiftEnterKeyBindingInstalled","editorMode","hasUsedBackslashReturn","supervisorMode","autoCompactEnabled","diffTool","env","tipsHistory","parallelTasksCount","todoFeatureEnabled","messageIdleNotifThresholdMs","autoConnectIde","autoInstallIdeExtension"];function Cs1(A){return oe.includes(A)}var te=["allowedTools","hasTrustDialogAccepted","hasCompletedProjectOnboarding","ignorePatterns"];function ol0(){let A=lA(),B=wT(xF(),WW);while(!0){if(B.projects?.[A]?.hasTrustDialogAccepted)return!0;let I=al0(A,"..");if(I===A)break;A=I}return!1}var _G8={...WW,autoUpdates:!1},jG8={...U$};function Xs1(A){return te.includes(A)}function Vd(A,B){if(B){let Q=WA();return A in Q&&Array.isArray(Q[A])}else{let Q=U$[A];return A in U$&&Array.isArray(Q)}}function MhQ(A,B){if(Vd(A,B))return!1;if(B){let Q=WA();return A in Q&&typeof Q[A]==="object"}else{let Q=U$[A];return A in U$&&typeof Q==="object"}}function RhQ(A,B){let Q=Array.from(new Set(B));switch(A){case"allowedTools":return Q.length>0?Q:["git diff:"];case"ignorePatterns":return Q.length>0?Q.map((I)=>Read(${I})):["Read(secrets.env)"]}}function OhQ(A,B){let Q=RhQ(A,B);switch(A){case"allowedTools":return{permissions:{allow:Q}};case"ignorePatterns":return{permissions:{deny:Q}}}}function ThQ(A,B){if(A!=="allowedTools"&&A!=="ignorePatterns")return;console.warn(`Warning: "claude config add ${A}" has been migrated to settings.json and will be removed in a future version.
Error: No suitable shell found. Claude CLI requires a Posix shell environment. Please ensure you have a valid shell installed and the SHELL environment variable set.
at IhQ (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:727:858)
at GhQ (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:727:2027)
at Q (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:542:14406)
at SS (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:2673:7813)
at async LDA.<anonymous> (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:2681:1041)
at async LDA.parseAsync (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:533:4184)
at async wJ4 (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:2693:1216)
at async HJ4 (file:///C:/Users/User/AppData/Roaming/nvm/v20.19.3/node_modules/@anthropic-ai/claude-code/cli.js:2673:9978)
Node.js v20.19.3
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗