BASH_MAX_OUTPUT_LENGTHとは — Bash出力の切り詰めを調整する環境変数
Bashコマンドの出力が途中で切れる原因は読み込み量の上限です。BASH_MAX_OUTPUT_LENGTHの既定値・上限・設定方法と、上げても変わらない部分までまとめました。
BASH_MAX_OUTPUT_LENGTHは何を変える変数か
BASH_MAX_OUTPUT_LENGTHは、Bashコマンドを実行したあとClaude Codeが結果へ読み戻す文字数を調整する環境変数です。既定値は30,000字、設定できる上限は150,000字です。ビルドログやテストスイートの出力が長く、必要な行が結果から漏れて見えなくなる場面で使います。
コマンド出力が結果になるまで
- 1
実行中は作業用ファイルへ流す
Claude Codeはコマンドの出力を、実行しながら作業用ファイルへストリーミングします。
- 2
終了後に読み戻す(この変数の担当)
コマンドが終わると、そのファイルを読み戻し窓の大きさまで読み戻します。この窓の大きさを決めるのが
BASH_MAX_OUTPUT_LENGTHです。 - 3
結果の種類で渡し方が分かれる
成功扱い(Valid)か失敗扱い(Failure)かで、Claudeに届く量と形が変わります。違いは次の節の図のとおりです。
設定方法 — シェルとsettings.jsonの使い分け
その場限りで試すならシェルのexportで十分です。
export BASH_MAX_OUTPUT_LENGTH=100000
claude恒久的に効かせたいならsettings.jsonのenvキーに書きます。個人の全プロジェクトに効かせるなら~/.claude/settings.json、チーム全員に効かせるならリポジトリの.claude/settings.jsonです。
{
"env": {
"BASH_MAX_OUTPUT_LENGTH": "100000"
}
}シェルとsettings.jsonの両方で同じ変数を設定した場合は、settings.jsonの値がシェルのexportを上書きします。CIのようにシェル変数で値を渡す運用では、リポジトリの設定に同じキーが入っていないか確かめてください。複数の設定ファイルが同じ変数を持つときは、優先順位の高いファイルの値が使われます。
優先順位の1位は組織管理者が配るmanaged設定で、次がコマンドラインです。そのあとは.claude/settings.local.json、.claude/settings.json、~/.claude/settings.jsonの順に続きます。managed設定が同じキーを持っていれば、個人側では上書きできません。自分だけがそのプロジェクトで値を変えたいなら、.claude/settings.local.jsonが向いています。Claude Codeが作ったこのファイルはgit管理から外されます。手で作った場合は、自分で.gitignoreに追加します。
envが効かない例外が2つあります。
- Claude Desktopアプリやself-hosted environmentのrunnerが起動したセッションでは、起動側が組み立てた環境が優先されます。起動側がすでに設定している変数については、設定ファイルの
envが無視されます。無視された変数名はデバッグログに出ます。 - プロジェクトと
settings.local.jsonのenvは、ワークスペースを信頼した後に反映されるのが原則です。ただし、タイムアウトや上限のように安全と分類された変数は、起動時から適用されます。-pモードでは信頼ダイアログが出ないため、起動時に適用されます。
上げても変わらない30,000字の壁
ここが最も誤解されやすい点です。BASH_MAX_OUTPUT_LENGTHを引き上げても、コマンドが正常終了した場合(Valid)にClaude Codeへインラインで渡る文字数の上限そのものは変わりません。この上限はおよそ30,000字で、BASH_MAX_OUTPUT_LENGTHの値とは独立しています。動かせるのはv2.1.261以降のbashOutputMaxChars設定だけです。
結果の種類ごとにClaudeへ届くもの
Valid(成功扱い)
約30,000字まではそのままインラインで届きます。超えると、セッションディレクトリに保存したファイルのパスと、冒頭2,000字までのプレビューに切り替わります。保存ファイルは64MiBを超えた分が切り詰められ、Claudeは必要なときに読んだり検索したりします。
Failure(失敗扱い)
約10,000字まではインラインで届きます。超えると、読み戻し窓から切り出した先頭と末尾の抜粋になり、ファイルパスは付きません。
広がるのは読み戻し窓です。Failureの抜粋はこの窓から切り出されるため、窓を広げると抜粋の切り出し元も広がります。抜粋そのものの長さは約10,000字のままです。
bashOutputMaxCharsは4,000〜128,000字の範囲に丸められ、インラインの上限と読み戻し窓を同時に決めます。設定した時点で、BASH_MAX_OUTPUT_LENGTHは無視されます。
成功と失敗の分かれ目は終了コードだけでは決まりません。終了コード1を成功扱いにするのは、grep・rg・egrep・fgrep・find・diff・test・[と、git diff・git grepです。これら以外のコマンドは、終了コード1なら失敗扱いになります。pgrepの該当なしやjq -eの判定失敗、差分があるときのcmpは、情報としては無害でも失敗側に入ります。
たとえばnpm run buildが45,000字のログを出しつつ正常終了したとします。このときClaude Codeが直接受け取るのは冒頭のプレビューとファイルパスだけで、ログ全体はセッションディレクトリのファイルに残ります。ビルドの警告が中盤に埋もれていても、Claudeがそのファイルを検索すれば見つけられる状態です。末尾に出る件数の要約行は、プレビューに入らないので、ファイルを読むまでClaudeの目に入りません。
一方、同じログを吐きながらnpm run build自体が失敗で終わった場合は話が違います。返るのは先頭と末尾を合わせて1万字前後の抜粋だけです。中盤の警告は、窓を広げても抜粋には入りません。上げて意味があるのは、出力が窓を超えて、末尾のエラーが窓から切れている場合です。窓が広がれば、抜粋の末尾がログの本当の末尾に近づきます。
症状から選ぶ — どの設定に触るか
公式ドキュメントが読み戻し窓を広げる場面として挙げるのは、詳細ログ付きのビルドやフルテストスイートのログのように、出力が窓をたびたび超えるコマンドです。症状ごとに触る設定は次のとおりです。
| 症状 | 結果の種類 | 触る設定 |
|---|---|---|
| 成功したのに、ログの中身をインラインで読ませたい | 結果の種類Valid | 触る設定bashOutputMaxChars(v2.1.261以降) |
| 出力が窓を超え、失敗の抜粋に末尾のエラーが出ない | 結果の種類Failure | 触る設定BASH_MAX_OUTPUT_LENGTHで窓を広げる |
| 150,000字でも足りない | 結果の種類どちらも | 触る設定コマンド側でtailやgrepを挟む |
| 長いコマンドが途中で打ち切られる | 結果の種類時間切れ | 触る設定BASH_DEFAULT_TIMEOUT_MSとBASH_MAX_TIMEOUT_MS |
150,000字は公式ドキュメントが「hard ceiling(絶対的な上限)」と明記しているため、それ以上の値を指定しても効きません。
似た名前の変数と混同しない
Claude Codeには「出力の上限」を扱う環境変数が複数あり、名前が似ているため混同しやすいところです。それぞれ対象が別なので、目的に合わせて選びます。bashOutputMaxCharsの使い方はbashOutputMaxCharsの設定ガイドにまとめました。
| 変数 | 対象 |
|---|---|
BASH_MAX_OUTPUT_LENGTH | 対象Bashツールの実行結果をClaude Codeが読み戻す文字数 |
MAX_MCP_OUTPUT_TOKENS | 対象MCPツールのレスポンスに許可するトークン数 |
CLAUDE_CODE_MAX_OUTPUT_TOKENS | 対象APIリクエスト1回あたりの最大出力トークン数 |
MAX_THINKING_TOKENS | 対象拡張思考(thinking)に割り当てるトークン予算 |
Claude自身の応答が途中で切れる、あるいはMCPサーバーからの戻り値が大きいといった症状は、Bash出力とは別の変数の管轄です。設定を変えたのに症状が直らないときは、どの経路の出力が切れているのかを先に切り分けます。
タイムアウト系のBASH_DEFAULT_TIMEOUT_MSとBASH_MAX_TIMEOUT_MSは、コマンドが打ち切られるまでの時間を扱います。既定は2分、最大は10分で、出力の文字数とは無関係です。
バックグラウンド実行と古い設定キーの扱い
フォアグラウンドのコマンドには、実行ごとにタイムアウトが掛かります。長く待ちたいときにClaudeがtimeoutパラメーターを付けて呼ぶ仕組みで、利用者が1回ごとのタイムアウトを指定することはありません。
バックグラウンドで始めたコマンドは、タイムアウトの数え方が別です。v2.1.285以降は、時間制限に達すると停止し、その理由がClaudeに伝わります。
Claudeがrun_in_backgroundで始めたコマンドには、既定で30分が割り当てられます。Claudeがtimeoutを渡せば、最大2時間までです。フォアグラウンドからCtrl+Bなどで移したコマンドには、移した時点から30分が割り当てられます。BASH_DEFAULT_TIMEOUT_MSを30分より長くすると、それがバックグラウンドの既定の時間制限にもなります。BASH_DEFAULT_TIMEOUT_MSとBASH_MAX_TIMEOUT_MSのうち大きい方が2時間を超えると、最大値も同じように伸びます。どちらも時間を短くする方向には効きません。長時間コマンドが消えたときに、出力上限と取り違えない手がかりになります。
PowerShellツールも、Bashと同じタイムアウトの規則と同じ2つの変数に従います。一方、変更履歴ではv2.1.261でtaskOutputMaxCharsが追加されましたが、設定リファレンスによるとv2.1.277でTaskOutputツールとともに削除されています。現行のバージョンでは設定しても効果がなく、バックグラウンドタスクの出力ファイルはReadで読まれます。古い記事や設定例でこのキーを見かけても、Bash出力の調整には使えません。
値の書式で気をつける点
タイムアウトやトークン予算などの整数系の環境変数は、v2.1.211以降なら1e6のような科学的記数法や64_000のような桁区切り表記も受け付けます。それ以前は、CLAUDE_CODE_MAX_OUTPUT_TOKENSなどで1e6が仮数部の1として読まれる不具合があり、v2.1.208で修正されました。古い環境が残っている場合は、10進の数字だけで書くのが確実です。
まとめ
まず、コマンドが成功扱いか失敗扱いかを確かめます。成功扱いなら、この変数を上げてもインラインの量は変わりません。
環境変数を横断で見比べたい場合はClaude Code環境変数リファレンス、設定ファイルの書き方全般はClaude Code設定ガイドにまとめています。コンテキストの消費を抑えたい場合はContext exceeds token limitの意味と対処も参考になります。