Skip to main content

A pure Python bash interpreter with in-memory virtual filesystem

Project description

just-bash-py (pre-release)

PyPI version Python 3.11+ License

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

just_bash-0.1.2.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

just_bash-0.1.2-py3-none-any.whl (255.9 kB view details)

Uploaded Python 3

File details

Details for the file just_bash-0.1.2.tar.gz.

File metadata

  • Download URL: just_bash-0.1.2.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for just_bash-0.1.2.tar.gz
Algorithm Hash digest
SHA256 22d5e313db3ede099a4b9b7988bf18038902f5cbda425818be5c3536c76bf805
MD5 f55c21409cb3be82e68b038532ed3504
BLAKE2b-256 9ba6360f6f333907c3b4fb1e9c6cb6a622ad70fb00b66850ba61e89ab2ab88c4

See more details on using hashes here.

File details

Details for the file just_bash-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: just_bash-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 255.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for just_bash-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d4c364e3356cfb6cc0de3acd29042d7b3c180eb65986889d84b23188f52d0144
MD5 a9bfcf3a248cf73e79cae5d380d34c42
BLAKE2b-256 7900d6444e6746d7bd7a6384ad44af356e6f5ca607347dfb4f9efdd938531e0f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page