Skip to main content

Bash replacement library for Python

Project description

minishell

An idiot admires complexity, a genius admires simplicity

©️ Legend Terry A. Davis

I want to ditch Bash and replace all use cases of it with Python. I recently learned that there's no good alternative for Bash. You can argue that there is, but then compare what they can write in Bash and how unreadable it becomes with any of the traditional shell solutions out there.

Goals

  • minishell is going to be extremely simple
  • Compete with Bash only
  • Do not add features just because other libraries have them
  • Stay focused: execute commands and parse arguments, nothing more

Philosophy

Bash works because it's the shell. You can't replicate that. But you can make Python script writing as painless as Bash for everything else: better error handling, better argument parsing, better readability.

minishell provides just what you need:

  • shell(cmd, *args) - Run commands with full TTY support and optional argument escaping
  • shell.read(cmd, *args) - Capture output
  • shell.args[1], shell.args.named_argument - Parse CLI arguments automatically

That's it. No frameworks, no magic.

Quick Start

# Raw command
shell("ls -la | grep test")

# With escaped arguments (safe!)
filename = "file with spaces.txt"
shell("rm {}", filename)

# Multiple arguments
shell("git commit -m {}", "Fix: Handle edge cases")

# Capture output
result = shell.read("pwd")
print("Current dir:", result.output)

# Arguments are auto-parsed
app_name = shell.args.app_name
if not app_name:
    shell.exit("Error: --app-name required")

API

shell(cmd, *args, exit_on_error=True)

Execute a command with optional argument escaping.

  • cmd: Command string with optional {} placeholders
  • args: Arguments to format and escape
  • exit_on_error: Exit on non-zero exit code (default: True)
shell("echo hello")                      # raw
shell("echo {}", "hello")                # with escaping
shell("ls", exit_on_error=False)         # don't exit on error

shell.read(cmd, *args)

Execute command and capture output.

result = shell.read("pwd")
print(result.output)
print(result.code)
print(result.ok)

shell.args

Automatically parsed command-line arguments.

# Positional
print(shell.args[0])

# Named arguments
print(shell.args.config)
print(shell.args.verbose)

# Multiple values become lists
if isinstance(shell.args.file, list):
    for f in shell.args.file:
        print(f)

shell.temp()

Context manager for temporary files.

with shell.temp() as tmp:
    shell(f"command > {tmp}")
    result = tmp.read()
    # file auto-deleted on exit

Installation

pip install minishell

Or just copy minishell.py to your project.

Why not Bash?

Feature Bash minishell
Argument parsing 50+ lines 3 lines
Variable syntax $VAR, ${VAR} f-strings
Error handling set -e (fragile) Explicit
Type hints None Full typing
Readability Medium High

Contributing

We need Bash specialists to provide code examples that are:

  • Cleaner/simpler in Bash than in Python with minishell
  • Real-world use cases we should optimize for

Alternatively, suggest improvements to keep the library minimal and focused. Pure critique without suggestions is also appreciated!

The bar for adding features: Does this save significant boilerplate compared to Bash?

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

minishell-2.0.0.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

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

minishell-2.0.0-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file minishell-2.0.0.tar.gz.

File metadata

  • Download URL: minishell-2.0.0.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for minishell-2.0.0.tar.gz
Algorithm Hash digest
SHA256 ef1eba7d4d63687e70f7707c78722d1bfd743d591c9c8f163a301360a01d24f2
MD5 5d2a131cbf1eb56d1a55fe88f1d21f1e
BLAKE2b-256 489b9162f4995c773cb88dd47a22851ab9b133e0af632e0e8e91834085a9bb36

See more details on using hashes here.

File details

Details for the file minishell-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: minishell-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for minishell-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9350cf684c4f2eb6205f384a4c39119535b6989b71e4c503bc486def3c6e296b
MD5 4e25c97f049168bdb14ad88faa9ac970
BLAKE2b-256 6cfd94326534da0a41c2a19d2958ede1d4e5790b374cd349e8dfb06025cdff73

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