メインコンテンツへスキップ
bashツールはClaudeがシェルコマンドを永続的なbashセッションで実行できるようにし、システム操作、スクリプト実行、コマンドラインオートメーションを可能にします。

概要

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

モデル互換性

モデルツールバージョン
Claude 4モデルとSonnet 3.7 (非推奨)bash_20250124
古いツールバージョンは新しいモデルとの後方互換性が保証されていません。常にモデルバージョンに対応するツールバージョンを使用してください。

ユースケース

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

クイックスタート

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": "List all Python files in the current directory."}
    ]
)

動作方法

bashツールは永続的なセッションを保持します:
  1. Claudeが実行するコマンドを決定
  2. bashシェルでコマンドを実行
  3. 出力(標準出力と標準エラー出力)をClaudeに返す
  4. セッション状態はコマンド間で保持される(環境変数、ワーキングディレクトリ)

パラメータ

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

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

例:マルチステップオートメーション

Claudeはコマンドをチェーンして複雑なタスクを完了できます:
# ユーザーリクエスト
"Install the requests library and create a simple Python script that fetches a joke from an API, then run it."

# 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 session restarted"
        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"Command contains dangerous pattern: {pattern}"
    
    # 必要に応じてさらに検証を追加
    return True, None

エラーを処理

bashツールを実装する場合、さまざまなエラーシナリオを処理してください:
コマンドの実行に時間がかかりすぎる場合:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "Error: Command timed out after 30 seconds",
      "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"Command timed out after {timeout} seconds"
環境変数とワーキングディレクトリを保持するために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... Output truncated ({len(lines)} total lines) ..."
    return output
実行されたコマンドの監査証跡を保持します:
import logging

def log_command(command, output, user_id):
    logging.info(f"User {user_id} executed: {command}")
    logging.info(f"Output: {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ツールはテキストエディタおよび他のツールと組み合わせると最も強力です。

次のステップ