Bashツールは、Claudeが永続的なbashセッションでシェルコマンドを実行することを可能にし、システム操作、スクリプト実行、コマンドライン自動化を行えます。

概要

Bashツールは、Claudeに以下の機能を提供します:
  • 状態を維持する永続的なbashセッション
  • あらゆるシェルコマンドを実行する能力
  • 環境変数と作業ディレクトリへのアクセス
  • コマンドチェーンとスクリプト機能

モデル互換性

モデルツールバージョン
Claude 4モデルとSonnet 3.7bash_20250124
Claude Sonnet 3.5 (非推奨)bash_20241022
Claude Sonnet 3.5 (非推奨)では、bashツールを使用する際にcomputer-use-2024-10-22ベータヘッダーが必要です。BashツールはClaude 4モデルとSonnet 3.7で一般利用可能です。
古いツールバージョンは新しいモデルとの後方互換性が保証されていません。常にモデルバージョンに対応するツールバージョンを使用してください。

使用例

  • 開発ワークフロー: ビルドコマンド、テスト、開発ツールの実行
  • システム自動化: スクリプトの実行、ファイル管理、タスクの自動化
  • データ処理: ファイルの処理、分析スクリプトの実行、データセットの管理
  • 環境設定: パッケージのインストール、環境の設定

クイックスタート

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    tools=[
        {
            "type": "bash_20250124",
            "name": "bash"
        }
    ],
    messages=[
        {"role": "user", "content": "現在のディレクトリ内のすべてのPythonファイルをリストしてください。"}
    ]
)

動作原理

Bashツールは永続的なセッションを維持します:
  1. Claudeが実行するコマンドを決定
  2. bashシェルでコマンドを実行
  3. 出力(stdoutとstderr)をClaudeに返す
  4. セッション状態がコマンド間で持続(環境変数、作業ディレクトリ)

パラメータ

パラメータ必須説明
commandはい*実行するbashコマンド
restartいいえbashセッションを再起動するにはtrueに設定
*restartを使用しない限り必須
// コマンドを実行
{
  "command": "ls -la *.py"
}

// セッションを再起動
{
  "restart": true
}

例:マルチステップ自動化

Claudeは複雑なタスクを完了するためにコマンドをチェーンできます:
# ユーザーリクエスト
"requestsライブラリをインストールし、APIからジョークを取得するシンプルなPythonスクリプトを作成して実行してください。"

# Claudeのツール使用:
# 1. パッケージをインストール
{"command": "pip install requests"}

# 2. スクリプトを作成
{"command": "cat > fetch_joke.py << 'EOF'\nimport requests\nresponse = requests.get('https://official-joke-api.appspot.com/random_joke')\njoke = response.json()\nprint(f\"Setup: {joke['setup']}\")\nprint(f\"Punchline: {joke['punchline']}\")\nEOF"}

# 3. スクリプトを実行
{"command": "python fetch_joke.py"}
セッションはコマンド間で状態を維持するため、ステップ2で作成されたファイルはステップ3で利用可能です。

Bashツールの実装

Bashツールはスキーマレスツールとして実装されています。このツールを使用する際、他のツールのように入力スキーマを提供する必要はありません。スキーマはClaudeのモデルに組み込まれており、変更できません。
1

bash環境のセットアップ

Claudeが対話できる永続的なbashセッションを作成:
import subprocess
import threading
import queue

class BashSession:
    def __init__(self):
        self.process = subprocess.Popen(
            ['/bin/bash'],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            bufsize=0
        )
        self.output_queue = queue.Queue()
        self.error_queue = queue.Queue()
        self._start_readers()
2

コマンド実行の処理

コマンドを実行し出力をキャプチャする関数を作成:
def execute_command(self, command):
    # bashにコマンドを送信
    self.process.stdin.write(command + '\n')
    self.process.stdin.flush()
    
    # タイムアウト付きで出力をキャプチャ
    output = self._read_output(timeout=10)
    return output
3

Claudeのツール呼び出しの処理

Claudeの応答からコマンドを抽出して実行:
for content in response.content:
    if content.type == "tool_use" and content.name == "bash":
        if content.input.get("restart"):
            bash_session.restart()
            result = "Bashセッションが再起動されました"
        else:
            command = content.input.get("command")
            result = bash_session.execute_command(command)
        
        # 結果をClaudeに返す
        tool_result = {
            "type": "tool_result",
            "tool_use_id": content.id,
            "content": result
        }
4

安全対策の実装

検証と制限を追加:
def validate_command(command):
    # 危険なコマンドをブロック
    dangerous_patterns = ['rm -rf /', 'format', ':(){:|:&};:']
    for pattern in dangerous_patterns:
        if pattern in command:
            return False, f"コマンドに危険なパターンが含まれています: {pattern}"
    
    # 必要に応じてさらなる検証を追加
    return True, None

エラーの処理

Bashツールを実装する際、様々なエラーシナリオを処理します:
コマンドの実行に時間がかかりすぎる場合:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "エラー: コマンドが30秒後にタイムアウトしました",
      "is_error": true
    }
  ]
}
コマンドが存在しない場合:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "bash: nonexistentcommand: command not found",
      "is_error": true
    }
  ]
}
権限の問題がある場合:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "bash: /root/sensitive-file: Permission denied",
      "is_error": true
    }
  ]
}

実装のベストプラクティスに従う

ハングするコマンドを防ぐためにタイムアウトを実装:
def execute_with_timeout(command, timeout=30):
    try:
        result = subprocess.run(
            command, 
            shell=True, 
            capture_output=True, 
            text=True, 
            timeout=timeout
        )
        return result.stdout + result.stderr
    except subprocess.TimeoutExpired:
        return f"コマンドが{timeout}秒後にタイムアウトしました"
環境変数と作業ディレクトリを維持するためにbashセッションを永続化:
# 同じセッションで実行されるコマンドは状態を維持
commands = [
    "cd /tmp",
    "echo 'Hello' > test.txt",
    "cat test.txt"  # まだ/tmpにいるため動作する
]
トークン制限の問題を防ぐために非常に大きな出力を切り詰め:
def truncate_output(output, max_lines=100):
    lines = output.split('\n')
    if len(lines) > max_lines:
        truncated = '\n'.join(lines[:max_lines])
        return f"{truncated}\n\n... 出力が切り詰められました(合計{len(lines)}行)..."
    return output
実行されたコマンドの監査証跡を保持:
import logging

def log_command(command, output, user_id):
    logging.info(f"ユーザー {user_id} が実行: {command}")
    logging.info(f"出力: {output[:200]}...")  # 最初の200文字をログ
コマンド出力から機密情報を削除:
def sanitize_output(output):
    # 潜在的な秘密や認証情報を削除
    import re
    # 例: AWS認証情報を削除
    output = re.sub(r'aws_access_key_id\s*=\s*\S+', 'aws_access_key_id=***', output)
    output = re.sub(r'aws_secret_access_key\s*=\s*\S+', 'aws_secret_access_key=***', output)
    return output

セキュリティ

Bashツールは直接的なシステムアクセスを提供します。これらの重要な安全対策を実装してください:
  • 分離された環境(Docker/VM)での実行
  • コマンドフィルタリングと許可リストの実装
  • リソース制限の設定(CPU、メモリ、ディスク)
  • すべての実行されたコマンドのログ記録

主要な推奨事項

  • ulimitを使用してリソース制約を設定
  • 危険なコマンドをフィルタリング(sudorm -rfなど)
  • 最小限のユーザー権限で実行
  • すべてのコマンド実行を監視およびログ記録

価格設定

The bash tool adds 245 input tokens to your API calls. Additional tokens are consumed by:
  • Command outputs (stdout/stderr)
  • Error messages
  • Large file contents
完全な価格設定の詳細については、ツール使用価格設定をご覧ください。

一般的なパターン

開発ワークフロー

  • テストの実行: pytest && coverage report
  • プロジェクトのビルド: npm install && npm run build
  • Git操作: git status && git add . && git commit -m "message"

ファイル操作

  • データの処理: wc -l *.csv && ls -lh *.csv
  • ファイルの検索: find . -name "*.py" | xargs grep "pattern"
  • バックアップの作成: tar -czf backup.tar.gz ./data

システムタスク

  • リソースの確認: df -h && free -m
  • プロセス管理: ps aux | grep python
  • 環境設定: export PATH=$PATH:/new/path && echo $PATH

制限事項

  • 対話型コマンドなし: vimless、パスワードプロンプトを処理できません
  • GUIアプリケーションなし: コマンドラインのみ
  • セッションスコープ: 会話内で持続、API呼び出し間では失われます
  • 出力制限: 大きな出力は切り詰められる可能性があります
  • ストリーミングなし: 完了後に結果が返されます

他のツールとの組み合わせ

Bashツールはテキストエディタや他のツールと組み合わせることで最も強力になります。

次のステップ