Claude Platform Docs
MessagesИнструменты

Инструмент bash

Позвольте Claude запрашивать команды оболочки, которые ваше приложение выполняет в постоянном сеансе bash и возвращает в виде результатов инструментов.

Инструмент bash — это клиентский инструмент: Claude не выполняет команды самостоятельно. Когда вы включаете инструмент в запрос, Claude отвечает блоком tool_use, в котором указана команда для выполнения. Ваше приложение выполняет эту команду в принадлежащем ему сеансе bash и возвращает вывод в блоке tool_result.

Ваше приложение поддерживает один процесс bash активным между вызовами инструмента, поэтому состояние сохраняется между командами. Рабочий каталог, переменные окружения и любые файлы, созданные командой, остаются доступными для следующей команды.

Текущая версия инструмента — bash_20250124. Сведения о поддержке моделей, бета-заголовках и более ранней версии см. в разделе Версии инструмента. Все инструменты, предоставляемые Anthropic, см. в Справочнике по инструментам.

Сценарии использования

  • Рабочие процессы разработки: запуск команд сборки, тестов и инструментов разработки
  • Автоматизация системы: выполнение скриптов, управление файлами, автоматизация задач
  • Обработка данных: обработка файлов, запуск скриптов анализа, управление наборами данных
  • Настройка окружения: установка пакетов, конфигурирование окружений

Быстрый старт

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    tools=[{"type": "bash_20250124", "name": "bash"}],
    messages=[
        {"role": "user", "content": "List all Python files in the current directory."}
    ],
)

print(response)

Claude отвечает с stop_reason: "tool_use" и блоком tool_use, содержащим команду, которую должно выполнить ваше приложение:

Output
{
  "id": "msg_01XAbCDeFgHiJkLmNoPQrStU",
  "model": "claude-opus-5",
  "stop_reason": "tool_use",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "I'll list all Python files in the current directory for you."
    },
    {
      "type": "tool_use",
      "id": "toolu_01A09q90qw90lq917835lq9",
      "name": "bash",
      "input": {
        "command": "ls *.py"
      }
    }
  ]
}

Выполните input.command в вашем сеансе bash и отправьте вывод обратно в виде tool_result. Полный цикл обмена см. в разделе Реализация инструмента bash.

Как это работает

Каждый вызов инструмента — это один цикл обмена между Claude и вашим приложением:

  1. Claude возвращает блок tool_use, содержащий command для выполнения.
  2. Ваше приложение выполняет команду в своём сеансе bash.
  3. Ваше приложение возвращает вывод команды, stdout и stderr вместе, в Claude в блоке tool_result.
  4. Claude либо запрашивает другую команду в том же сеансе, либо отвечает текстом.

Claude также может вернуть несколько блоков tool_use в одном ответе. Выполните их по порядку в том же сеансе и верните все результаты в одном сообщении user. См. Параллельное использование инструментов.

API не хранит состояние. Никакие сведения о вашем сеансе оболочки не передаются между запросами, поэтому ваше приложение решает, когда сеанс начинается, как долго он живёт и когда его перезапускать. Полный цикл запроса и ответа см. в разделе Обработка вызовов инструментов.

Параметры

Определение инструмента bash имеет два обязательных поля, type и name, причём name должно быть bash. Инструмент не имеет схемы: вы не предоставляете input_schema, поскольку схема встроена в модель Claude и не может быть изменена. В следующей таблице перечислены входные поля, которые Claude задаёт при вызове инструмента.

ПараметрОбязательныйОписание
commandДа*Команда bash для выполнения
restartНетУстановите в true, чтобы перезапустить сеанс bash

*Обязателен, если не используется restart

Чтобы обработать restart: true, завершите процесс оболочки, запустите новый и верните tool_result, подтверждающий перезапуск. Перезапущенный сеанс начинается с чистого состояния: рабочий каталог, переменные окружения и любые запущенные процессы исчезают.

Версии инструмента

bash_20250124 — текущая версия инструмента, и она не требует бета-заголовка. Её принимает каждая модель, начиная с Claude Sonnet 3.7 (выведена из эксплуатации), включая все текущие модели Claude.

Исходная версия bash_20241022 работает только с моделью Claude Sonnet 3.5 от октября 2024 года (выведена из эксплуатации). Запросы, использующие её, требуют заголовка anthropic-beta: computer-use-2024-10-22, а SDK предоставляют её только в своих бета-пространствах имён. В новых интеграциях следует использовать bash_20250124.

Пример: многошаговая автоматизация

Claude может связывать команды в цепочку между вызовами инструмента для выполнения многошаговой задачи:

User request:
"Install the requests library and create a simple Python script that
fetches a joke from an API, then run it."

Claude's tool uses:
1. Install package
   {"command": "pip install requests"}

2. Create script
   {"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. Run script
   {"command": "python fetch_joke.py"}

Сеанс сохраняет состояние между командами, поэтому файлы, созданные на шаге 2, доступны на шаге 3.

Реализация инструмента bash

Claude определяет, какую команду выполнить. Всё остальное принадлежит вашему приложению: процесс оболочки, тайм-аут и проверки безопасности. Следующие шаги показывают минимальную реализацию.

  1. Создайте постоянный сеанс bash

    Запустите один долгоживущий процесс bash и выполняйте каждую команду внутри него. Поскольку канал к работающему процессу никогда не сообщает о конце файла, сеанс выводит уникальную строку-маркер после каждой команды, чтобы отметить, где заканчивается вывод этой команды:

    import subprocess
    import uuid
    
    
    class BashSession:
        """A bash process that stays alive between commands so state persists."""
    
        def __init__(self):
            self.process = subprocess.Popen(
                ["/bin/bash"],
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE,
                stderr=subprocess.STDOUT,  # interleave errors with output, in order
                start_new_session=True,  # own process group: a timeout can kill every child
                text=True,
            )
    
        def execute_command(self, command):
            """Run a command in the session and return its output."""
            sentinel = f"__CLAUDE_BASH_DONE_{uuid.uuid4().hex}__"  # unique per call
            self.process.stdin.write(f"{command}\necho {sentinel}\n")
            self.process.stdin.flush()
    
            output = []
            for line in self.process.stdout:
                if sentinel in line:  # this command's output is complete
                    break
                output.append(line)
            return "".join(output)
    
        def restart(self):
            self.process.kill()
            self.process.wait()
            self.__init__()
    
    
    bash_session = BashSession()
    print(bash_session.execute_command("cd /tmp && pwd"))
    print(bash_session.execute_command("pwd"))  # still /tmp: the session kept its state

    Сеанс чередует stderr с stdout, поэтому сообщения об ошибках оказываются там, где они произошли. В примере опущено то, что также необходимо полной реализации: тайм-аут, который завершает оболочку и все запущенные ею процессы, когда команда зависает, а затем перезапускает сеанс. Рекомендация Используйте тайм-ауты команд показывает один из способов его добавить.

  2. Обработайте вызовы инструментов от Claude

    Извлеките и выполните команды из ответов Claude:

    tool_results = []
    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)
    
            # Один tool_result на каждый блок tool_use, все возвращаются в следующем сообщении пользователя
            tool_results.append(
                {"type": "tool_result", "tool_use_id": content.id, "content": result}
            )
  3. Верните результат в Claude

    Отправьте tool_result обратно в сообщении user, продолжающем тот же разговор. Claude либо запрашивает другую команду в том же сеансе, либо завершает свой ответ:

    client = anthropic.Anthropic()
    
    response = client.messages.create(
        model="claude-opus-5",
        max_tokens=1024,
        tools=[{"type": "bash_20250124", "name": "bash"}],
        messages=[
            {"role": "user", "content": "List all Python files in the current directory."},
            {
                "role": "assistant",
                "content": [
                    {
                        "type": "tool_use",
                        "id": "toolu_01A09q90qw90lq917835lq9",
                        "name": "bash",
                        "input": {"command": "ls *.py"},
                    }
                ],
            },
            {
                "role": "user",
                "content": [
                    {
                        "type": "tool_result",
                        "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
                        "content": "analysis.py\nprocess_data.py\n",
                    }
                ],
            },
        ],
    )
    
    print(response.content)

    Повторяйте цикл «выполнить и вернуть», пока stop_reason равен tool_use. Полный цикл см. в разделе Обработка результатов клиентских инструментов.

  4. Реализуйте меры безопасности

    Добавьте проверку и ограничения. Используйте список разрешённых, а не список запрещённых: список запрещённых пропускает любую команду, которую он не предусмотрел. Пример также отклоняет операторы оболочки, которые встречаются как отдельные слова:

    import shlex
    
    ALLOWED_COMMANDS = {"ls", "cat", "echo", "pwd", "grep", "find", "wc", "head", "tail"}
    SHELL_OPERATORS = {"&&", "||", "|", ";", "&", ">", "<", ">>"}
    
    
    def validate_command(command):
        # Разрешать только команды из явного списка разрешённых
        try:
            tokens = shlex.split(command)
        except ValueError:
            return False, "Could not parse command"
    
        if not tokens:
            return False, "Empty command"
    
        executable = tokens[0]
        if executable not in ALLOWED_COMMANDS:
            return False, f"Command '{executable}' is not in the allowlist"
    
        # Отклонять операторы оболочки, записанные отдельными словами
        for token in tokens[1:]:
            if token in SHELL_OPERATORS or token.startswith(("$", "`")):
                return False, f"Shell operator '{token}' is not allowed"
    
        return True, None

    Эта проверка — сигнальная ловушка для очевидных ошибок, а не граница принудительного контроля. Она отклоняет разделённые пробелами цепочки (&&), конвейеры и перенаправление, которые используются в других примерах на этой странице. Она не обнаруживает оператор, приклеенный к слову, например cat data.txt|grep x, поскольку токенизатор сохраняет data.txt|grep внутри одного токена. Решите, какие команды и операторы разрешает ваше приложение. Настоящий контроль — это изоляция: запускайте весь сеанс внутри контейнера или виртуальной машины (см. Безопасность).

Обработка ошибок

Когда команда завершается неудачей или сеанс ломается, сообщите Claude, что произошло. Верните сообщение как содержимое tool_result и установите is_error в true, что помечает вызов инструмента как неудачный. См. Обработка ошибок с помощью is_error.

Следуйте лучшим практикам реализации

Безопасность

Помимо изоляции, добавьте следующие меры контроля:

  • Проверяйте команды перед их выполнением, используя список разрешённых, а не список запрещённых. См. Реализация инструмента bash.
  • Установите ограничения ресурсов для процесса оболочки (ЦП, память и диск), например с помощью ulimit.
  • Журналируйте каждую команду и её вывод, чтобы можно было провести аудит того, что выполнялось.
  • Удаляйте учётные данные и другие секреты из вывода перед его возвратом в Claude.

Цены

Определение инструмента bash добавляет следующие входные токены к вашему запросу. Это в дополнение к системной подсказке использования инструментов для каждой модели, которая применяется всякий раз, когда присутствует какой-либо инструмент.

МодельДополнительные входные токены
Claude Opus 5, Claude Opus 4.8 и Claude Opus 4.7325 токенов
Claude Opus 4.6, Claude Sonnet 4.6 и более ранние244 токена

Дополнительные токены расходуются на:

  • Вывод команд (stdout/stderr)
  • Сообщения об ошибках
  • Содержимое больших файлов

Полные сведения о ценах см. в разделе цены на использование инструментов.

Распространённые шаблоны

Рабочие процессы разработки

  • Запуск тестов: pytest && coverage report
  • Сборка проектов: npm install && npm run build
  • Операции Git: git status && git add . && git commit -m "message"

Рекомендации по использованию git в качестве механизма контрольных точек и восстановления в длительных агентных рабочих процессах см. в разделе лучшие практики управления состоянием.

Операции с файлами

  • Обработка данных: 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

Ограничения

  • Нет интерактивных команд: сеанс не может выполнять vim, less, запросы пароля или любую команду, ожидающую ввода на stdin.
  • Нет приложений с графическим интерфейсом: сеанс работает только в командной строке.
  • Область действия сеанса: состояние сеанса bash находится на стороне клиента. Ваше приложение отвечает за поддержание сеанса оболочки между ходами.
  • Ограничения вывода: API не обрезает результаты инструментов (запрос слишком большого размера отклоняется). Обрезайте большие выводы в вашем приложении перед их возвратом в Claude.
  • Нет потоковой передачи: «streaming» (потоковая передача) не поддерживается — вывод достигает Claude только тогда, когда ваше приложение возвращает tool_result в следующем запросе.

Сочетание с другими инструментами

Инструмент bash хорошо сочетается с инструментом текстового редактора: Claude редактирует файл одним инструментом и запрашивает команду, которая его запускает, другим.

Следующие шаги

Просматривайте и изменяйте текстовые файлы для отладки, исправления и улучшения кода.

Подключите Claude к внешним инструментам и API. Узнайте, где выполняются инструменты, когда Claude их вызывает и какой инструмент подходит для вашей задачи.

Was this page helpful?