- name
- run-shell-fallback
- description
- Use run_shell with inline Python as a reliable fallback when execute_code_sandbox or read_file fail
# Run Shell Fallback Pattern
This skill provides a reliable workaround when `execute_code_sandbox` or `read_file` fail with 'unknown error' by switching to `run_shell` with inline Python code.
## When to Use
Apply this pattern when you encounter:
- `execute_code_sandbox` fails with "unknown error" or timeout
- `read_file` fails to read accessible files with "unknown error"
- Sandbox environment is unreliable for your specific task
## How to Implement
### 1. File Reading Fallback
When `read_file` fails, use `run_shell` with Python or `cat`:
**For text files:**
```bash
run_shell(command="cat /path/to/file.txt")
```
**For structured parsing (Python one-liner):**
```bash
run_shell(command="python3 -c \"import json; print(json.load(open('/path/to/file.json')))\"")
```
**For multi-line Python processing:**
```bash
run_shell(command="python3 << 'EOF'
with open('/path/to/file.txt', 'r') as f:
content = f.read()
# Process content here
print(content.upper())
EOF")
```
### 2. Code Execution Fallback
When `execute_code_sandbox` fails, use `run_shell` with inline Python:
**Simple one-liners:**
```bash
run_shell(command="python3 -c \"print('Hello'); import os; print(os.getcwd())\"")
```
**Multi-line scripts (heredoc):**
```bash
run_shell(command="python3 << 'EOF'
import os
import json
def process_data(data):
return {k: v.upper() if isinstance(v, str) else v for k, v in data.items()}
with open('input.json') as f:
data = json.load(f)
result = process_data(data)
print(json.dumps(result, indent=2))
EOF")
```
**With inline file write:**
```bash
run_shell(command="python3 << 'EOF'
result = {'status': 'success', 'count': 42}
with open('output.json', 'w') as f:
json.dump(result, f, indent=2)
print('File written successfully')
EOF")
```
### 3. Decision Flow
```
1. Attempt execute_code_sandbox or read_file
2. If failure with 'unknown error':
a. Determine task type (code execution vs file reading)
b. Choose inline Python approach (-c for simple, heredoc for complex)
c. Execute via run_shell
d. Parse output as needed
3. Continue with task using results from run_shell
```
## Best Practices
1. **Escape quotes properly** in `-c` commands: Use `\"` for double quotes inside the command string
2. **Use heredoc for complex scripts**: When code exceeds 2-3 lines or needs multiple imports, use `<< 'EOF'` syntax
3. **Quote EOF marker**: Use `<< 'EOF'` (with quotes) to prevent variable expansion in the heredoc
4. **Capture stdout**: Design your inline Python to print results to stdout for easy capture
5. **Error handling**: Add try/except blocks in your inline Python to catch and report errors clearly
6. **File paths**: Use absolute paths when possible, or ensure working directory is correct
## Examples
### Example 1: Read and parse JSON after read_file failure
```bash
run_shell(command="python3 -c \"import json; data=json.load(open('config.json')); print(data['key'])\"")
```
### Example 2: Process CSV data after execute_code_sandbox failure
```bash
run_shell(command="python3 << 'EOF'
import csv
with open('data.csv', 'r') as f:
reader = csv.DictReader(f)
rows = list(reader)
print(f\"Total rows: {len(rows)}\")
for row in rows[:5]:
print(row)
EOF")
```
### Example 3: Transform and write output file
```bash
run_shell(command="python3 << 'EOF'
import json
with open('input.json') as f:
data = json.load(f)
transformed = [item.upper() if isinstance(item, str) else item for item in data]
with open('output.json', 'w') as f:
json.dump(transformed, f, indent=2)
print('Transformation complete')
EOF")
```
## Limitations
- run_shell executes in the shell environment, not the sandbox - ensure paths and dependencies are available
- Output is limited to stdout/stderr - use file writes for large data
- Complex multi-file projects may require creating temporary script files first
عرض على GitHub