A pure Python bash interpreter with in-memory virtual filesystem
Project description
just-bash-py (pre-release)
A pure Python bash interpreter with an in-memory virtual filesystem, designed for AI agents needing a secure, sandboxed bash environment.
This is a Python port of just-bash, the emulated bash interpreter for TypeScript, from Vercel.
This is a pre-release. This as much a demonstration of coding agents' ability to implement software given a tight spec and high test coverage, as discussed here and here.
Features
- Pure Python - No external binaries, no WASM dependencies
- In-memory filesystem - Sandboxed virtual filesystem for safe execution
- 70+ commands - grep, sed, awk, jq, curl, and more
- Full bash syntax - Pipes, redirections, variables, arrays, functions, control flow
- 32 shell builtins - cd, export, declare, test, and more
- Async execution - Built on asyncio for non-blocking operation
- Security limits - Prevent infinite loops, excessive recursion, runaway execution
Installation
pip install just-bash
Quick Start
from just_bash import Bash
bash = Bash()
# Simple command
result = bash.run('echo "Hello, World!"')
print(result.stdout) # Hello, World!
# Pipes and text processing
result = bash.run('echo "banana apple cherry" | tr " " "\\n" | sort')
print(result.stdout) # apple\nbanana\ncherry\n
# Variables and arithmetic
result = bash.run('x=5; echo $((x * 2))')
print(result.stdout) # 10
# Arrays
result = bash.run('arr=(a b c); echo "${arr[@]}"')
print(result.stdout) # a b c
# In-memory files
result = bash.run('echo "test" > /tmp/file.txt; cat /tmp/file.txt')
print(result.stdout) # test
For async contexts, use await bash.exec() instead of bash.run().
Demo
Run the interactive demo to see all features in action:
python examples/demo.py
This demonstrates variables, arrays, control flow, pipes, text processing, JSON handling with jq, functions, and more.
API
Bash Class
from just_bash import Bash
# Create with optional initial files
bash = Bash(files={
"/data/input.txt": "line1\nline2\nline3\n",
"/config.json": '{"key": "value"}'
})
# Execute commands
result = await bash.exec("cat /data/input.txt | wc -l")
# Result object
print(result.stdout) # Standard output
print(result.stderr) # Standard error
print(result.exit_code) # Exit code (0 = success)
Configuration Options
bash = Bash(
files={...}, # Initial filesystem contents
env={...}, # Environment variables
cwd="/home/user", # Working directory
network_enabled=False, # Enable/disable network (curl)
)
Security
- No native execution - All commands are pure Python implementations
- Network disabled by default - curl requires explicit enablement
- Execution limits - Prevents infinite loops and excessive resource usage
- Filesystem isolation - Virtual filesystem keeps host system safe
- SQLite sandboxed - Only in-memory databases allowed
Supported Features
Shell Syntax
- Variables:
$VAR,${VAR},${VAR:-default},${VAR:+alt},${#VAR} - Arrays:
arr=(a b c),${arr[0]},${arr[@]},${#arr[@]} - Arithmetic:
$((expr)),((expr)), increment/decrement, ternary - Quoting: Single quotes, double quotes,
$'...', escapes - Expansion: Brace
{a,b}, tilde~, glob*.txt, command$(cmd) - Control flow:
if/then/else/fi,for/do/done,while,until,case - Functions:
func() { ... }, local variables, return values - Pipes:
cmd1 | cmd2 | cmd3 - Redirections:
>,>>,<,2>&1, here-docs
Parameter Expansion
- Default values:
${var:-default},${var:=default} - Substring:
${var:offset:length} - Pattern removal:
${var#pattern},${var##pattern},${var%pattern},${var%%pattern} - Replacement:
${var/pattern/string},${var//pattern/string} - Case modification:
${var^^},${var,,},${var^},${var,} - Length:
${#var},${#arr[@]} - Indirection:
${!var},${!prefix*},${!arr[@]} - Transforms:
${var@Q},${var@a},${var@A}
Conditionals
- Test command:
[ -f file ],[ "$a" = "$b" ] - Extended test:
[[ $var == pattern ]],[[ $var =~ regex ]] - Arithmetic test:
(( x > 5 )) - File tests:
-e,-f,-d,-r,-w,-x,-s,-L - String tests:
-z,-n,=,!=,<,> - Numeric tests:
-eq,-ne,-lt,-le,-gt,-ge
Shell Builtins
: . [ alias break builtin cd command
continue declare eval exec exit export false let
local mapfile readarray readonly return set shift shopt
source test true type typeset unalias unset wait
Available Commands
File Operations
cat chmod cp find ln ls mkdir mv
rm stat touch tree
Text Processing
awk column comm cut diff expand fold grep
egrep fgrep head join nl od paste rev
rg sed sort split strings tac tail tee
tr unexpand uniq wc
Data Processing
jq yq xan sqlite3
Path Utilities
basename dirname pwd readlink which
Compression & Encoding
base64 gzip gunzip zcat md5sum sha1sum sha256sum tar
System & Environment
alias clear date du echo env expr false
file help history hostname printenv printf read seq
sleep timeout true unalias xargs
Network
curl (disabled by default)
Shell
bash sh
License
Apache 2.0
Acknowledgments
This project is a Python port of just-bash by Vercel. The TypeScript implementation provided the design patterns, test cases, and feature specifications that guided this Python implementation.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file just_bash-0.1.3.tar.gz.
File metadata
- Download URL: just_bash-0.1.3.tar.gz
- Upload date:
- Size: 447.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d97192a74f7046637f823face8d7a2d4b7e1e980a424f18a85203513b7bc640
|
|
| MD5 |
52700c74dacf3329dc1d7ab00f9445a5
|
|
| BLAKE2b-256 |
6e5382a9745e22ba3ade511d257d64498f9dce22ae4b0fee1f73ed54f0392ffc
|
File details
Details for the file just_bash-0.1.3-py3-none-any.whl.
File metadata
- Download URL: just_bash-0.1.3-py3-none-any.whl
- Upload date:
- Size: 257.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9911c630e331411cb8d36674bbc41ce9727cedb4063335dd285f99402396ffb
|
|
| MD5 |
b40c8d2986f4c157a53733b36a1dee5c
|
|
| BLAKE2b-256 |
6af845509d55d56f7baab9335cdc3d497e7e930ad025c57d8d910a3b80f900e7
|