The bash tool enables Claude to execute shell commands in a persistent bash session, allowing system operations, script execution, and command-line automation.
The bash tool provides Claude with:
| Model | Tool Version |
|---|---|
| Claude 4 models and Sonnet 3.7 (deprecated) | bash_20250124 |
Older tool versions are not guaranteed to be backwards-compatible with newer models. Always use the tool version that corresponds to your model version.
The bash tool maintains a persistent session:
| Parameter | Required | Description |
|---|---|---|
command | Yes* | The bash command to run |
restart | No | Set to true to restart the bash session |
*Required unless using restart
Claude can chain commands to complete complex tasks:
# 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"}The session maintains state between commands, so files created in step 2 are available in step 3.
The bash tool is implemented as a schema-less tool. When using this tool, you don't need to provide an input schema as with other tools; the schema is built into Claude's model and can't be modified.
When implementing the bash tool, handle various error scenarios:
The bash tool provides direct system access. Implement these essential safety measures:
ulimit to set resource constraintssudo, rm -rf, etc.)The bash tool adds 245 input tokens to your API calls.
Additional tokens are consumed by:
See tool use pricing for complete pricing details.
pytest && coverage reportnpm install && npm run buildgit status && git add . && git commit -m "message"wc -l *.csv && ls -lh *.csvfind . -name "*.py" | xargs grep "pattern"tar -czf backup.tar.gz ./datadf -h && free -mps aux | grep pythonexport PATH=$PATH:/new/path && echo $PATHvim, less, or password promptsThe bash tool is most powerful when combined with the text editor and other tools.
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."}
]
)Set up a bash environment
Create a persistent bash session that Claude can interact with:
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()Handle command execution
Create a function to execute commands and capture output:
def execute_command(self, command):
# Send command to bash
self.process.stdin.write(command + '\n')
self.process.stdin.flush()
# Capture output with timeout
output = self._read_output(timeout=10)
return outputProcess Claude's tool calls
Extract and execute commands from Claude's responses:
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)
# Return result to Claude
tool_result = {
"type": "tool_result",
"tool_use_id": content.id,
"content": result
}Implement safety measures
Add validation and restrictions:
def validate_command(command):
# Block dangerous commands
dangerous_patterns = ['rm -rf /', 'format', ':(){:|:&};:']
for pattern in dangerous_patterns:
if pattern in command:
return False, f"Command contains dangerous pattern: {pattern}"
# Add more validation as needed
return True, NoneView and edit text files with Claude