[{"data":1,"prerenderedAt":755},["ShallowReactive",2],{"content-/claude-code-shell-bash-on-mac":3,"all-pages-for-dir":733,"related-/claude-code-shell-bash-on-mac":734,"og-image-/claude-code-shell-bash-on-mac":754},{"id":4,"title":5,"body":6,"category":716,"concepts":716,"description":717,"extension":718,"meta":719,"navigation":720,"ogImage":716,"path":721,"project_name":716,"published":722,"publishedAt":723,"seo":724,"source":716,"stem":725,"tags":726,"todo":716,"unpublished":722,"updatedAt":723,"__hash__":732},"pages/2026-09/2026-09-28/claude-code-shell-bash-on-mac.md","Mac の Claude Code で Bash ツールが zsh として動く問題は CLAUDE_CODE_SHELL で直る",{"type":7,"value":8,"toc":702},"minimark",[9,22,27,34,37,40,44,51,176,190,193,197,200,210,230,244,247,251,266,279,289,430,445,448,456,527,548,551,563,566,570,589,609,613,628,642,646,668,671,698],[10,11,12,13,17,18,21],"p",{},"Mac で Claude Code を使うと、Bash ツールのコマンドは bash ではなく zsh で実行される。\nClaude は bash の書き方でコマンドを組み立てるので、zsh との文法の違いで途中から実行されないことがある。\n環境変数 ",[14,15,16],"code",{},"CLAUDE_CODE_SHELL"," に ",[14,19,20],{},"/bin/bash"," を指定すると、Bash ツールは bash で動くようになる。\nこの記事では、Mac の直近2か月のセッションログで実際に何件失敗していたかを数え、指定の前後で挙動がどう変わるかを実機で確かめた結果をまとめる。",[23,24,26],"h2",{"id":25},"bash-ツールが-zsh-で動く理由","Bash ツールが zsh で動く理由",[10,28,29,30,33],{},"Claude Code の Bash ツールは、名前に反して「利用者のシェル」でコマンドを実行する。\n公式ドキュメントによれば、シェルの自動判定は ",[14,31,32],{},"$SHELL"," が bash か zsh を指していればそれを使う。\nmacOS は Catalina 以降、ログインシェルの既定が zsh なので、何も設定しなければ Bash ツールは zsh で動く。",[10,35,36],{},"Windows では事情が違う。\nWindows 版は Git Bash を使うので、同じ設定のまま2台で使っていても、文法の違いで失敗するのは Mac 側だけになる。",[10,38,39],{},"筆者はこの差を埋めるために、Bash ツールに渡る bash の書き方を zsh 向けに書き換えるフックを試していた。\nしかし、書き換えが必要な構文の種類が多く、うまく動かなかった。\nシェルの側を bash に合わせるほうが筋がよい。",[23,41,43],{"id":42},"直近2か月のログで数えた-zsh-固有のエラー","直近2か月のログで数えた zsh 固有のエラー",[10,45,46,47,50],{},"Mac の ",[14,48,49],{},"~/.claude/projects/"," に残っているセッションログ（2026年8月から9月）を対象に、Bash ツールの結果から zsh でしか起きないエラーを数えた。\n期間中の Bash ツールの呼び出しは約9,200回あった。\nそのうち zsh 固有のエラーは77件で、約50のセッションに散らばっていた。",[52,53,54,73],"table",{},[55,56,57],"thead",{},[58,59,60,64,67,70],"tr",{},[61,62,63],"th",{},"エラーの種類",[61,65,66],{},"件数",[61,68,69],{},"実際に失敗したコマンドの例",[61,71,72],{},"bash での結果",[74,75,76,97,122,138,157],"tbody",{},[58,77,78,86,89,94],{},[79,80,81,82,85],"td",{},"glob が何にも一致しない（",[14,83,84],{},"no matches found","）",[79,87,88],{},"62",[79,90,91],{},[14,92,93],{},"grep -rn foo . --include=*.html",[79,95,96],{},"そのまま実行される",[58,98,99,108,111,116],{},[79,100,101,104,105,85],{},[14,102,103],{},"="," で始まる語をコマンド名として展開する（",[14,106,107],{},"=== not found",[79,109,110],{},"11",[79,112,113],{},[14,114,115],{},"echo =====",[79,117,118,121],{},[14,119,120],{},"====="," と表示される",[58,123,124,127,130,135],{},[79,125,126],{},"変数のワード分割がされない",[79,128,129],{},"2",[79,131,132],{},[14,133,134],{},"FILES=\"a.md b.md\"; for f in $FILES",[79,136,137],{},"2要素でループする",[58,139,140,146,149,154],{},[79,141,142,145],{},[14,143,144],{},"status"," が読み取り専用",[79,147,148],{},"1",[79,150,151],{},[14,152,153],{},"status=$(grep ...)",[79,155,156],{},"普通に代入できる",[58,158,159,166,168,173],{},[79,160,161,162,165],{},"ループ変数 ",[14,163,164],{},"path"," で PATH が壊れる",[79,167,148],{},[79,169,170],{},[14,171,172],{},"for path in \"/\" \"/lessons\"; do ...",[79,174,175],{},"何も起きない",[10,177,178,179,182,183,186,187,189],{},"件数は、1回のコマンド実行を1件として数えている。\nglob の不一致62件のうち14件は、",[14,180,181],{},"grep"," の ",[14,184,185],{},"--include=*.html"," のようにクォートしていないオプションが glob として展開されたものだった。\nbash なら一致するファイルがなければ文字列がそのまま ",[14,188,181],{}," に渡り、意図どおりに動く。",[10,191,192],{},"8月が72件、9月が5件と、9月は件数が少ない。\nただし9月は Mac で Claude Code を使う時間が減っており（Bash ツールの呼び出しが8月の約8,800回に対して9月は約440回）、呼び出しあたりの頻度は下がっていない。\n最後に起きたのは9月25日で、今も続いている。",[194,195,196],"h3",{"id":196},"失敗の仕方が分かりにくい",[10,198,199],{},"件数より困るのは、失敗の現れ方である。",[10,201,202,203,205,206,209],{},"zsh は glob の不一致や ",[14,204,103],{}," の展開エラーを起こすと、そのコマンド行の残りを実行せずに終了する。\n",[14,207,208],{},"cat a.mjs; echo =====; cat b.mjs"," のように区切り線を挟んで複数のファイルを読もうとすると、最初のファイルだけ表示して残りが消える。",[10,211,212,213,215,216,218,219,221,222,225,226,229],{},"ループ変数に ",[14,214,164],{}," を使った例では、zsh の小文字の ",[14,217,164],{}," が PATH と連動した配列なので、ループに入った時点で PATH が書き換わる。\nその後の ",[14,220,58],{}," や ",[14,223,224],{},"head"," が ",[14,227,228],{},"command not found"," になり、コマンドを直しに行くと原因が見えにくい。",[10,231,232,233,236,237,225,240,243],{},"ワード分割の例は、エラーが出ないまま終わることもある。\n2026年8月22日のセッションでは、",[14,234,235],{},"for f in $FILES"," が1要素でしか回らず、",[14,238,239],{},"sed",[14,241,242],{},"File name too long"," で失敗した。\n同じセッションには、終了コードが0のまま何も変更されずに終わる経路もあった。",[10,245,246],{},"失敗するたびに、原因の調べ直しと再実行が挟まることになる。",[23,248,250],{"id":249},"claude_code_shell-で-bash-に切り替わるか","CLAUDE_CODE_SHELL で bash に切り替わるか",[10,252,253,262,263,265],{},[254,255,261],"a",{"href":256,"target":257,"rel":258},"https://code.claude.com/docs/en/env-vars","_blank",[259,260],"noopener","noreferrer","公式ドキュメントの環境変数一覧","には、",[14,264,16],{}," が次のように書かれている。",[267,268,269,273,276],"ul",{},[270,271,272],"li",{},"Bash ツールのコマンドを実行するシェルを指定する",[270,274,275],{},"指定できるのは bash か zsh の実行ファイルのパスだけで、fish などは使えない",[270,277,278],{},"使えないパスを指定すると、何も言わずに自動判定へ戻る",[10,280,281,282,285,286,288],{},"この変数は Claude Code 2.0.65 で追加された。\n公式の説明は分かったので、Mac（Claude Code 2.1.282）で ",[14,283,284],{},"claude -p"," を使い、同じコマンドを未設定のときと ",[14,287,20],{}," を指定したときで実行して比べた。",[52,290,291,306],{},[55,292,293],{},[58,294,295,298,301],{},[61,296,297],{},"確認したこと",[61,299,300],{},"未設定（zsh）",[61,302,303],{},[14,304,305],{},"CLAUDE_CODE_SHELL=/bin/bash",[74,307,308,323,340,356,379,398,419],{},[58,309,310,313,318],{},[79,311,312],{},"実際のシェル",[79,314,315],{},[14,316,317],{},"ZSH_VERSION=5.9",[79,319,320],{},[14,321,322],{},"BASH_VERSION=3.2.57(1)-release",[58,324,325,330,335],{},[79,326,327],{},[14,328,329],{},"echo ====",[79,331,332,334],{},[14,333,107],{}," で行の残りが止まる",[79,336,337,121],{},[14,338,339],{},"====",[58,341,342,347,352],{},[79,343,344],{},[14,345,346],{},"status=ok",[79,348,349],{},[14,350,351],{},"read-only variable: status",[79,353,354],{},[14,355,346],{},[58,357,358,363,369],{},[79,359,360,362],{},[14,361,235],{},"（2ファイル）",[79,364,365,368],{},[14,366,367],{},"[a.md b.md]"," の1回だけ",[79,370,371,374,375,378],{},[14,372,373],{},"[a.md]"," ",[14,376,377],{},"[b.md]"," の2回",[58,380,381,390,393],{},[79,382,383,386,387],{},[14,384,385],{},"for path in x y"," の後の ",[14,388,389],{},"command -v head",[79,391,392],{},"見つからない",[79,394,395],{},[14,396,397],{},"/usr/bin/head",[58,399,400,405,410],{},[79,401,402],{},[14,403,404],{},"grep ... --include=*.nomatchext",[79,406,407,409],{},[14,408,84],{}," で行全体が止まる",[79,411,412,414,415,418],{},[14,413,181],{}," が実行され、後続の ",[14,416,417],{},"echo"," も動く",[58,420,421,424,427],{},[79,422,423],{},"brew、node、pnpm、gh、codex、claude の場所",[79,425,426],{},"見つかる",[79,428,429],{},"同じ場所で見つかる",[10,431,432,433,436,437,440,441,444],{},"指定すると、表の zsh 固有のエラーはすべて起きなくなった。\nsettings.json の ",[14,434,435],{},"env"," に書いた場合も、",[14,438,439],{},"--settings '{\"env\":{\"CLAUDE_CODE_SHELL\":\"/bin/bash\"}}'"," で起動して ",[14,442,443],{},"BASH_VERSION=3.2.57"," になることを確かめた。",[23,446,447],{"id":447},"設定方法",[10,449,450,182,453,455],{},[14,451,452],{},"~/.claude/settings.json",[14,454,435],{}," に1行足す。",[457,458,463],"pre",{"className":459,"code":460,"language":461,"meta":462,"style":462},"language-json shiki shiki-themes vitesse-light vitesse-light","{\n  \"env\": {\n    \"CLAUDE_CODE_SHELL\": \"/bin/bash\"\n  }\n}\n","json","",[14,464,465,474,493,515,521],{"__ignoreMap":462},[466,467,470],"span",{"class":468,"line":469},"line",1,[466,471,473],{"class":472},"shFtX","{\n",[466,475,477,481,484,487,490],{"class":468,"line":476},2,[466,478,480],{"class":479},"sqvqQ","  \"",[466,482,435],{"class":483},"sz8Xr",[466,485,486],{"class":479},"\"",[466,488,489],{"class":472},":",[466,491,492],{"class":472}," {\n",[466,494,496,499,501,503,505,509,512],{"class":468,"line":495},3,[466,497,498],{"class":479},"    \"",[466,500,16],{"class":483},[466,502,486],{"class":479},[466,504,489],{"class":472},[466,506,508],{"class":507},"sMJiu"," \"",[466,510,20],{"class":511},"sdGka",[466,513,514],{"class":507},"\"\n",[466,516,518],{"class":468,"line":517},4,[466,519,520],{"class":472},"  }\n",[466,522,524],{"class":468,"line":523},5,[466,525,526],{"class":472},"}\n",[10,528,529,17,532,535,536,541,542,544,545,547],{},[14,530,531],{},"~/.zshrc",[14,533,534],{},"export CLAUDE_CODE_SHELL=/bin/bash"," を書いてもよいが、settings.json なら Claude Code をどのターミナルから起動しても効く。\n",[254,537,540],{"href":538,"target":257,"rel":539},"https://code.claude.com/docs/en/settings-reference",[259,260],"設定リファレンス","の「",[14,543,435],{}," で無視される変数」に ",[14,546,16],{}," は入っていない。",[10,549,550],{},"設定したら、Claude Code のセッションを開き直す。\n動作中のセッションで切り替わるかどうかは確かめていない。",[10,552,553,554,556,557,559,560,562],{},"settings.json を Windows と共有していても問題はない。\nWindows で ",[14,555,16],{}," を未設定、",[14,558,20],{},"、存在しないパスの3通りにして同じ確認をしたところ、どれも Git Bash 5.2.37 で動いた。\nWindows では ",[14,561,20],{}," が使えないパスとして扱われ、自動判定に戻るためと考えられる。",[23,564,565],{"id":565},"切り替える前に確かめておくこと",[194,567,569],{"id":568},"macos-の-binbash-は-32","macOS の /bin/bash は 3.2",[10,571,572,573,576,577,580,581,584,585,588],{},"macOS に標準で入っている bash は 3.2 で、連想配列（",[14,574,575],{},"declare -A","）、",[14,578,579],{},"mapfile","、",[14,582,583],{},"${var,,}"," のような bash 4 以降の構文は使えない。\n公式ドキュメントの例が Homebrew の bash（",[14,586,587],{},"/opt/homebrew/bin/bash","）を指定しているのはこのためだろう。",[10,590,591,592,580,594,580,596,580,599,601,602,604,605,608],{},"筆者の環境では、2か月分のログに ",[14,593,575],{},[14,595,579],{},[14,597,598],{},"readarray",[14,600,583],{}," を使ったコマンドは1件もなかった。\nこのため ",[14,603,20],{}," で足りると判断した。\nbash 4 以降の構文を使うスクリプトが多いなら、",[14,606,607],{},"brew install bash"," で入れた bash を指定すればよい。",[194,610,612],{"id":611},"zshrc-のエイリアスと関数は読まれなくなる",".zshrc のエイリアスと関数は読まれなくなる",[10,614,615,616,580,618,580,621,624,625,627],{},"Claude Code はセッションの開始時に、シェルに応じて ",[14,617,531],{},[14,619,620],{},"~/.bashrc",[14,622,623],{},"~/.profile"," のどれかを読み込み、エイリアスと関数を Bash ツールに引き継ぐ。\nbash に切り替えると、",[14,626,531],{}," に書いたエイリアスや関数は Bash ツールから使えなくなる。",[10,629,630,631,634,635,638,639,641],{},"PATH は別で、Claude Code を起動したシェルの環境をそのまま引き継ぐ。\n筆者の Mac は Homebrew の PATH を ",[14,632,633],{},"~/.zprofile"," で、",[14,636,637],{},"~/.local/bin"," を ",[14,640,531],{}," で通しているが、bash に切り替えても brew や claude は同じ場所で見つかった。",[194,643,645],{"id":644},"bash-にしても-macos-のコマンドの違いは残る","bash にしても macOS のコマンドの違いは残る",[10,647,648,649,652,653,656,657,221,660,663,664,667],{},"bash に変えて直るのは、シェルの文法の違いだけである。\nmacOS の ",[14,650,651],{},"sed -i"," の書き方、",[14,654,655],{},"timeout"," コマンドが無いこと、",[14,658,659],{},"stat",[14,661,662],{},"date"," のオプションの違いは、BSD 系のコマンドと GNU 系のコマンドの違いなので、シェルを変えても残る。\nログにも ",[14,665,666],{},"command not found: timeout"," がまとまった数あったが、これは bash にしても解消しない。",[23,669,670],{"id":670},"まとめ",[267,672,673,676,679,689],{},[270,674,675],{},"Mac の Claude Code の Bash ツールは zsh で動き、直近2か月で約9,200回の呼び出しのうち77件が zsh 固有のエラーで失敗していた",[270,677,678],{},"zsh のエラーはコマンド行の残りを止めたり、PATH を壊したり、成功したように見えたりするので、原因に気づきにくい",[270,680,681,182,683,17,685,688],{},[14,682,452],{},[14,684,435],{},[14,686,687],{},"\"CLAUDE_CODE_SHELL\": \"/bin/bash\""," を書けば、表の失敗はすべて起きなくなる。Windows と共有しても支障はない",[270,690,691,692,694,695,697],{},"切り替えると ",[14,693,531],{}," のエイリアスと関数は Bash ツールで使えなくなり、",[14,696,20],{}," は 3.2 のままである",[699,700,701],"style",{},"html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sqvqQ, html code.shiki .sqvqQ{--shiki-default:#99841877;--shiki-dark:#99841877}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":462,"searchDepth":476,"depth":476,"links":703},[704,705,708,709,710,715],{"id":25,"depth":476,"text":26},{"id":42,"depth":476,"text":43,"children":706},[707],{"id":196,"depth":495,"text":196},{"id":249,"depth":476,"text":250},{"id":447,"depth":476,"text":447},{"id":565,"depth":476,"text":565,"children":711},[712,713,714],{"id":568,"depth":495,"text":569},{"id":611,"depth":495,"text":612},{"id":644,"depth":495,"text":645},{"id":670,"depth":476,"text":670},null,"Mac の Claude Code の Bash ツールは zsh で動き、bash の書き方が途中で止まる。2か月分のログで zsh 固有のエラーを数え、CLAUDE_CODE_SHELL=/bin/bash で解消することを実測で確かめた。","md",{},true,"/claude-code-shell-bash-on-mac",false,"2026-09-28T00:00:00.000Z",{"title":5,"description":717},"2026-09/2026-09-28/claude-code-shell-bash-on-mac",[727,728,729,730,731],"Claude Code","zsh","bash","macOS","シェル","9yqogU65dwPFqc-3c4lhfN7bbQHzpkazP9e9qUeEajQ",[],[735,739,743,747,751],{"title":736,"path":737,"publishedAt":738},"ウィンドウを閉じても消えないターミナルをtmuxで用意する","/tmux-persistent-terminal-sessions","2026-08-19T00:00:00.000Z",{"title":740,"path":741,"publishedAt":742},"Claude Code の設定一式を Windows と Mac の2台で共有する移行作業","/dotclaude-two-machine-migration","2026-08-10T00:00:00.000Z",{"title":744,"path":745,"publishedAt":746},"MacのPDFビューアーを自作する計画と、計画書レビューを必ず通す運用に戻した記録","/mac-pdf-viewer-plan-and-review-rule","2026-08-07T00:00:00.000Z",{"title":748,"path":749,"publishedAt":750},"2026年8月4日の開発日記 - 守ってくれているつもりの仕掛けが、止まっていた","/2026-08-04-diary","2026-08-04T00:00:00.000Z",{"title":752,"path":753,"publishedAt":750},"Macへの移行でバックアップを作り直したら、削除ガードが動いていなかった","/mac-migration-backup-and-delete-guard","https://log.eurekapu.com/og/blog/claude-code-shell-bash-on-mac.png?v=2026-09-28T00%3A00%3A00.000Z&title=Mac%20%E3%81%AE%20Claude%20Code%20%E3%81%A7%20Bash%20%E3%83%84%E3%83%BC%E3%83%AB%E3%81%8C%20zsh%20%E3%81%A8%E3%81%97%E3%81%A6%E5%8B%95%E3%81%8F%E5%95%8F%E9%A1%8C%E3%81%AF%20CLAUDE_CODE_SHELL%20%E3%81%A7%E7%9B%B4%E3%82%8B&author=Kei%20Komatsu&sig=bf871ecc8eea8611",1790554828537]