[BUG] Claude Code crash with "Error: No suitable shell found." in Win 11 with Git Bash

Resolved 💬 2 comments Opened Jul 18, 2025 by it-sha Closed Jul 18, 2025

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

  1. install CC with npm
  2. activate CC with subscription
  3. skip steps for onboarding
  4. see error below

or

  1. run bash command claude
  2. 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

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗