Skip to content

Instantly share code, notes, and snippets.

@pmarreck
Last active January 28, 2026 14:33
Show Gist options
  • Select an option

  • Save pmarreck/b7bd1c270cb77005205bf91f80c4e130 to your computer and use it in GitHub Desktop.

Select an option

Save pmarreck/b7bd1c270cb77005205bf91f80c4e130 to your computer and use it in GitHub Desktop.
Comparison of Bash, Elvish, NuShell, Murex, es-shell, fish, xonsh, PowerShell, Oil and Ion shells

Comparison of Bash, Elvish, NuShell, Murex, es-shell, fish, xonsh, PowerShell, Oils (Oil/OSH/YSH) and Ion shells

(Originally generated by ChatGPT and reviewed/edited by Claude; now corrected/expanded based on reader feedback. YMMV.)

(generated by chatgpt 4o and reviewed/edited by claude 3.5 sonnet, YMMV)

Feature Bash Elvish NuShell Murex es-shell Fish Xonsh PowerShell Oil Ion
Language Paradigm Imperative, procedural Functional, with built-in data structures Structured, pipeline-based, table-oriented Hybrid (Shell + Programming Language) Functional, with higher-order functions Imperative, with focus on user-friendliness Python-based, multi-paradigm Object-oriented, imperative Bash-compatible with modern language features Rust-inspired, focusing on performance
Syntax Traditional Unix shell syntax, can be cryptic Pythonic, with Lisp-like elements Custom syntax, resembling a mix of shell and Rust Shell-like syntax with additional programming features Simple, functional syntax inspired by RC and Plan 9 shell Fish-specific, designed for readability Python syntax with shell-like additions PowerShell-specific, verbose but clear Bash-like with additional modern constructs Rust-like syntax with shell conveniences
Data Types Strings, arrays, associative arrays (dictionaries) Supports lists, maps, numbers, strings Strongly typed tables, lists, dictionaries Structured types like arrays, objects, maps Lists, strings, functions as first-class citizens Lists, dictionaries (associative arrays) Full Python types + shell-specific types .NET objects, strong typing Rich type system, including records and variants Primitive types, arrays, maps
Scripting Language Yes, widely used for scripting, highly expressive but with some limitations Yes, suitable for complex scripting Yes, designed for scripting and data manipulation Yes, with rich programming constructs Yes, with functional scripting capabilities Yes, with a focus on interactive use Yes, leveraging Python's capabilities Yes, powerful scripting with .NET framework Yes, aiming for better scripting than Bash Yes, with a focus on performance and safety
Pipeline Processing Yes, but data passed as unstructured text Yes, supports structured data in pipelines Yes, table-oriented pipeline with structured data by default Yes, with support for structured data Yes, with functional data flow Yes, with some structured data support Yes, can pipe Python objects Yes, pipes .NET objects Yes, with improvements over Bash Yes, with efficient data passing
Error Handling Basic error handling using exit codes Exception handling like modern programming languages Built-in error handling with custom commands Advanced error handling with try-catch-like structures Basic, using functional approach Improved error messages and handling Python-style exception handling Advanced error handling and reporting Improved error handling over Bash Rust-inspired error handling
Cross-Platform Support Yes, but native Windows support requires WSL or third-party implementations Yes, cross-platform Yes, cross-platform Yes, cross-platform Yes, cross-platform Yes, cross-platform Yes, cross-platform Yes, truly cross-platform (Windows, Linux, macOS) Yes, aims for cross-platform compatibility Limited, primarily focused on Unix-like systems
Interactive Features REPL with autocompletion and command history Rich REPL with autocompletion, suggestions, and innovative directory navigation Interactive REPL with a focus on data pipelines Interactive REPL with scripting support Minimal REPL, functional style Extensive autosuggestions, web-based configuration Python REPL with shell integrations Rich REPL with object inspection Aims to improve upon Bash's interactive features Efficient command-line editing and history
Concurrency Support Yes, via job control and external tools Supports concurrent execution through peach command and background jobs Yes, supports parallel execution with par-each command Yes, supports concurrency through parallel processing No native concurrency support Basic job control Python's concurrency primitives Robust support for parallel processing Improved job control over Bash Efficient multi-threading support
Extensibility Extendable via functions and external scripts Extendable through functions and modules Custom commands and plugins Extendable via built-in modules and external tools Extendable via higher-order functions and custom scripts Plugin system, customizable completions Extensible through Python modules Extensible through .NET modules and snap-ins Aiming for better extensibility than Bash Extendable through custom commands
Integration with Traditional Shell Tools High, fully integrates with Unix tools Good integration, supports many POSIX shell commands Good integration, but designed to be more self-contained High, integrates with many traditional Unix tools Good integration, but unique syntax may affect seamless use High integration with Unix tools Can use both Python libraries and shell tools Can use traditional tools, but often has built-in alternatives High, aiming for Bash compatibility Good integration with Unix tools
Package Management None built-in, relies on external tools Built-in package manager Built-in package manager (nu_plugin) None built-in, but can use external tools None built-in, relies on external tools Built-in package manager (fisher) Can use pip and conda PowerShellGet for modules None built-in, aiming for compatibility with existing tools None built-in, relies on system package manager
Documentation & Community Extensive documentation, very large community Good documentation, active community Growing documentation, active community Moderate documentation, smaller community Sparse documentation, niche community Extensive documentation, large community Good documentation, growing community Extensive documentation, large community Growing documentation and community Moderate documentation, smaller community
Target Audience General users, system administrators, developers Users interested in functional programming and modern shell features Data analysts, developers focused on structured data and pipelines Developers wanting a more capable shell with additional programming features Enthusiasts of functional programming and minimalistic design Users seeking a more user-friendly shell experience Python developers, data scientists Windows administrators, cross-platform devops Users seeking a modern Bash alternative Systems programmers, performance enthusiasts
Unique Features Ubiquitous, standard shell on Unix-like systems Modular design, innovative directory history and navigation Native support for structured data (tables, JSON) in pipelines Strong type system, with advanced scripting capabilities Higher-order functions, minimalistic and functional, influenced by Plan 9 Web-based configuration, extensive autosuggestions Seamless integration of Python and shell commands Object-oriented pipeline, .NET integration Aiming for better language design while maintaining Bash compatibility High performance, memory safety from Rust
Maturity Highly mature, widely adopted Mature and stable Relatively new, under active development Less mature, niche user base Mature but niche, with a small user base Mature, widely adopted alternative shell Stable, actively developed Mature, widely used in Windows environments Under active development, not yet stable Relatively new, under active development

Additional Advantages Over Bash:

  • Elvish:

    • Provides functional programming capabilities and richer data structures
    • Offers a more modern, Pythonic syntax
    • Features innovative directory navigation and history management
    • Includes a built-in package manager
  • NuShell:

    • Offers table-oriented data pipelines and strong typing
    • Treats command outputs as structured data (like tables or JSON) by default
    • Provides a custom syntax designed for modern data processing and analysis
    • Includes a built-in package manager (nu_plugin)
  • Murex:

    • Combines traditional shell scripting with advanced programming constructs
    • Offers better error handling with try-catch-like structures
    • Provides a strong type system for more robust scripting
  • Es Shell:

    • Provides a minimalistic, functional shell environment with higher-order functions
    • Offers a simple syntax inspired by RC and Plan 9 shell, which can be more expressive for certain tasks
  • Fish (Friendly Interactive Shell):

    • Offers superior out-of-the-box experience with user-friendly features
    • Provides extensive autosuggestions and web-based configuration
    • Includes a built-in package manager (fisher)
    • Features more readable and consistent syntax
  • Xonsh:

    • Combines the power of Python with shell scripting
    • Allows seamless use of Python libraries in shell operations
    • Provides Python-style exception handling in a shell environment
  • PowerShell:

    • Provides object-oriented pipelines, allowing for more structured data manipulation
    • Offers deep integration with the .NET framework
    • Features strong typing and advanced error handling
    • Truly cross-platform (Windows, Linux, macOS) with native support
  • Oil:

    • Aims to address Bash's limitations while maintaining compatibility
    • Offers a rich type system, including records and variants
    • Provides improved error handling and language design
    • Potentially offers a smoother transition for Bash users seeking modern features
  • Ion:

    • Focuses on performance and memory safety, leveraging Rust's strengths
    • Offers efficient multi-threading support
    • Provides a Rust-inspired syntax with shell conveniences
    • Emphasizes speed in command-line editing and history operations

Quick-scan table (mostly Yes/No)

Legend: ✅ yes, ❌ no, ⚠️ partial/depends, 🧩 via plugins/community tooling

Property Bash Elvish NuShell Murex es-shell fish xonsh PowerShell Oils Ion
Structured pipeline by default (not just text) ⚠️ ⚠️ ⚠️
Cross-platform (Windows without WSL) ⚠️ ⚠️ ⚠️
Bash/POSIX compatibility goal
Good interactive UX out-of-box ⚠️ ⚠️ ⚠️ ⚠️ ⚠️
First-class modules/packages 🧩 ⚠️ 🧩 ✅ (Python)
Built-in package manager 🧩 (nupm) ✅ (murex-package) ❌ (community) 🧩 (pip/conda) ✅ (PowerShellGet / Gallery ecosystem)
Maturity (1=young, 5=mature) 5 4 3 3 2 4 4 5 3 2

Notes:

  • Murex package manager correction: Murex includes its own package manager (murex-package). It’s oriented around installing packages from URIs (often git repos) rather than a single central “app store” style repository.
  • NuShell packages: There’s an official community package manager repo (nupm) and module install patterns, but it’s not “built into the nu binary” in the same way as, say, PowerShell’s default module ecosystem.
  • “Cross-platform” here is about practical native support; everything can be made to run somewhere if you squint hard enough.

Detailed comparison (descriptive)

Feature Bash Elvish NuShell Murex es-shell fish xonsh PowerShell Oils (Oil/OSH/YSH) Ion
Language paradigm Imperative, procedural Functional-leaning, rich data structures Structured, pipeline/table oriented Hybrid shell + language Functional-leaning (rc/Plan9-ish) Imperative, UX-first Python-based Object-oriented + imperative Bash-compatible + better language goals Rust-ish “modern shell”
Syntax Traditional POSIX/Bash Modern, consistent Custom, data-centric Expressive, typed streams Minimalist, functional Readable, consistent Python + shell primitives Verbose but explicit Transitional: OSH/Bash-like; YSH adds more Concise, Rust-flavored
Core data types Strings, arrays, maps Lists, maps, numbers Tables/records/lists Structured types, typed streams Lists/functions Lists, vars Full Python types .NET objects OSH for shell; YSH adds richer types Arrays/maps, primitives
Pipeline semantics Text streams Structured values Structured tables by default Typed/structured data streams Functional composition Mostly text Python objects possible .NET objects Mostly shell-like; some upgrades Mixed
Error handling Exit codes, set -e footguns Exceptions / structured errors Structured errors Better error patterns Minimal Better UX errors Python exceptions Structured errors Better than Bash intent Rust-ish patterns
Interactive features Completion/history varies Strong REPL, navigation Strong REPL Strong REPL Basic Best-in-class UX Depends config Strong REPL + inspection Improving Basic/varies
Extensibility Shell funcs + external tools Modules/functions Plugins + commands Modules + tooling Extensible language Completions/functions Python ecosystem Modules/snap-ins Project-driven Custom commands
Package management None Built-in ecosystem Community tooling (e.g., nupm) Built-in (murex-package) None Community (fisher, etc.) pip/conda PowerShellGet/Gallery None None
Best fit Ubiquitous scripting + portability Modern shell scripting Data wrangling pipelines Safer/typed shell work Minimal functional shell Daily interactive shell Python-heavy workflows Admin + automation + objects Bash upgrade path Experimental modern shell

“Advantages over Bash” (with corrected bits)

  • Elvish

    • Richer built-in data structures + functional-ish style
    • Clean, consistent scripting ergonomics
    • Excellent interactive features
  • NuShell

    • Structured data pipelines (tables/records) so you stop parsing strings
    • Great for inspecting / transforming data
    • Plugin ecosystem; community package tooling (ex: nupm)
  • Murex

    • Strong focus on safer, structured/typed streams and modern scripting ergonomics
    • Includes a package manager (murex-package) oriented around URIs / repos rather than a single central catalog
  • es-shell

    • Minimalist, functional-ish shell derived from rc traditions
  • fish

    • Best out-of-the-box interactive experience, autosuggestions, easy config
  • xonsh

    • Python integration: you get the whole Python ecosystem in your shell
  • PowerShell

    • Object pipelines + .NET integration
    • Strong tooling + module ecosystem
    • Truly cross-platform PowerShell Core
  • Oils (Oil/OSH/YSH)

    • Designed as an upgrade path: keep running shell scripts (OSH), write better ones (YSH)
    • Explicitly targets Bash/POSIX pain points while staying compatible where it matters
  • Ion

    • Rust-based shell with performance/safety aspirations; more experimental/niche

Meta note: Shell choice is less about “best language” and more about where you want your suffering to live: in quoting rules, in type conversions, in plugin ecosystems, or in portability constraints.

Note: While these shells offer various advantages, the choice of shell often depends on specific use cases, personal preferences, and the operating system environment. Bash remains highly capable and is the most widely used and supported shell across Unix-like systems, with a vast ecosystem of scripts and tools built around it.

@esafak
Copy link

esafak commented Jan 21, 2026

I'd suggest rephrasing the properties so they can be qualified as a simple yes/no, or number, so readers can scan the table more quickly.

@pmarreck
Copy link
Author

@rsenna @humphreylee @esafak

Implemented all of your suggestions. Probably still needs cleanup, but I'm short on time currently, enjoy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment