vim bash-is-the-medicine.md

The Shell-Industrial Complex Sold You A Cure For A Disease That Never Existed

Fish, Zsh, and Oh My Zsh convinced you bash was broken. It was not. Bash and ble.sh are the real answer, and the shell-industrial complex does not want you to know.

Omar Alani February 15, 2026 9 min read

There is a grift running through the developer tools ecosystem, and it has been running for over a decade. It goes like this: take bash, the most ubiquitous, battle-tested, POSIX-compliant shell on earth, the one that ships with virtually every Unix system ever built, the one that has been powering infrastructure since before most of today’s developers were born, and convince people it is broken. Outdated. Hostile. Unusable without help. Then sell them the cure.

The cure is fish. The cure is zsh with Oh My Zsh. The cure is an entirely new shell language with incompatible syntax, or a framework that bolts two hundred plugins onto a shell that did not need them, then makes your terminal take four seconds to start. The cure is a mass psychosis where developers genuinely believe they cannot function in a terminal without syntax highlighting, autosuggestions, and a prompt theme called Powerlevel10k that renders a small operating system every time you press Enter.

And the medicine, the actual medicine, has been sitting right there the whole time. Bash. And now, ble.sh.

The Prosecution’s Case Against The Alternative Shell Industrial Complex

Fish: The Prison They Convinced You Was Luxurious

Let me be clear about what fish is. Fish is not POSIX-compliant. It does not want to be. It is proud of this. The fish developers looked at decades of POSIX shell conventions, conventions that every Unix system, every CI pipeline, every Docker container, every deployment script, every piece of infrastructure automation on earth depends on, and said: “No. We are going to do our own thing.” They will tell you this is a feature. They will tell you POSIX syntax is ugly and that fish’s syntax is cleaner and more intuitive.

This is not beautification. This is sabotage. Fish took &&, the single most fundamental operator in shell, the thing that chains every command in every script on every Unix system on earth, and threw it away. Their replacement? Two keywords: ; and (yes, really). They held this position for over a decade before they finally caved and added && back.

Every fish script you write is something you cannot hand to a colleague, cannot paste into a server, cannot run in a Docker container without installing fish first. Every Stack Overflow answer you try to paste into fish breaks. Every production server you SSH into does not have fish and never will.

Fish chose vibes over portability. It is the programming equivalent of learning Esperanto because you think English grammar is messy, then getting angry that nobody at the airport understands you.

Zsh: Nothing Here That Bash Does Not Do Better

Here is the truth about zsh. Nothing in zsh is better than bash. Nothing. The globbing, the arrays, the completion, the features zsh users brag about, bash does all of it. The difference is that zsh cannot do any of it without a framework.

You want proof? Look at what zsh users actually run. It is not zsh. It is Oh My Zsh. Or Prezto. Or Zinit. Or Antigen. Or Zplug. Or one of the other fifteen plugin managers that exist because the zsh ecosystem has a plugin dependency problem that makes the JavaScript ecosystem look restrained. The shell cannot stand on its own. It needs a framework to be usable.

Oh My Zsh ships with over 300 plugins. Three hundred. Let that sink in. The average Oh My Zsh user enables maybe ten of them and has no idea what the other 290 do. They copy-pasted a .zshrc from a Medium article in 2019 and have not touched it since. Their shell takes 2-4 seconds to start because it is loading git integration, nvm initialization, rbenv setup, kubectl completions, Docker aliases, Kubernetes context display, AWS profile detection, and a prompt theme that makes an API call to check the weather.

I am not exaggerating. Time your Zsh startup. Go ahead. Run time zsh -i -c exit and come back. I will wait.

Compare that to bash. A clean bash login takes 50-100 milliseconds. Not seconds. Milliseconds. Because bash is not loading a framework. Bash is not initializing 47 plugins you forgot you installed. Bash starts, reads your .bashrc, and gets out of your way.

And here is the real knife: nothing Oh My Zsh gives you requires zsh. Not a single thing. Git aliases? You can define those in bash with one line in your .bashrc. Directory shortcuts? Bash has CDPATH and you can write a cd wrapper in four lines. Colored output? Bash supports ANSI escape codes natively. Completions? Bash has bash-completion, which covers every major command-line tool and does not require a plugin manager to install. Every feature, every plugin, every convenience that Oh My Zsh provides is something bash already does or can do with a few lines in your .bashrc.

Oh My Zsh did not solve a problem. It manufactured one. It told you bash was inadequate, handed you a bloated framework, and called it progress. You did not upgrade your shell. You added a middleman.

The Real Motive

Why did all of this happen? Why did an entire ecosystem spring up around the premise that bash is inadequate?

Because bash is boring. Bash is old. Bash does not have a logo or a landing page with a dark theme and a tagline about developer experience. Bash does not have a GitHub star count that goes up when someone tweets about it. Bash does not have a conference talk circuit where maintainers can demo new features with animated terminal recordings.

Bash just works. It has worked for 35 years. It will work for 35 more. And that is precisely why it does not generate hype. You cannot build a personal brand around telling people to use the thing that was already there.

The Defense: Bash Was Never The Problem

Let me tell you what bash actually is in 2026.

Bash 5.3 dropped in July 2025 with improved error reporting, updated Readline, and refined script parsing. It is actively maintained, actively improving, and still the most mature, powerful, POSIX-compliant shell on earth. But even before 5.3, bash had features that most of its critics do not know exist because they stopped paying attention in 2015. Here is what bash gives you out of the box:

Associative arrays. declare -A map; map[key]=value. Real hash maps. In your shell. Since bash 4.0, released in 2009. Most people who say bash lacks data structures have never opened man bash past the first page.

Programmable completion. complete -F _my_function mycommand. You can write completion functions that are as sophisticated as anything Zsh or fish offers. The bash-completion package provides completions for over 200 commands. Install it and forget about it.

Process substitution. diff <(command1) <(command2). Compare the output of two commands without temporary files. Clean. Elegant. Been there since forever.

Coprocesses. coproc myproc { command; }. Run background processes and communicate with them through file descriptors. This is genuinely powerful systems-level capability baked into a shell.

Extended globbing. shopt -s extglob; ls !(*.log). Pattern matching that covers 90% of what people use Zsh’s globbing for.

History management. HISTCONTROL=ignoreboth, HISTSIZE=100000, shopt -s histappend. Infinite history, deduplication, and cross-session sharing. Configure it once and never think about it again.

The people who tell you bash is primitive are telling you about bash 3.2, which shipped with macOS because Apple refused to adopt GPLv3. They are looking at a version Apple froze in 2007 for licensing reasons and concluding the entire project is dead. Meanwhile bash 5.3 is sitting right there, actively maintained, actively improving, and still running the infrastructure that their fancy alternative shells depend on to exist.

The Revelation: ble.sh

And now we get to the part that should make every fish and Zsh user uncomfortable.

ble.sh (Bash Line Editor) is a single project, written entirely in pure bash, that gives you everything you switched shells for. Everything. And it does it without replacing your shell, without breaking your scripts, without a plugin manager, and without adding seconds to your startup time.

Here is what ble.sh provides:

Syntax highlighting. Real-time, as-you-type syntax highlighting of your commands. The exact feature that fish users cite as the number one reason they switched. Ble.sh does it in bash. No external dependencies. No compiled extensions.

Autosuggestions. Ghost text suggestions based on your command history. The second most cited reason people switch to fish.

Enhanced completion. Menu-based completion with descriptions, fuzzy matching, and cycling through options. The thing people install fzf-tab in Zsh for. Ble.sh does it. In bash.

Vim and Emacs editing modes. Full vi-mode with visual feedback, mode indicators, and proper cursor shape changes. Ble.sh builds on bash’s native vi-mode and elevates it with the polish and responsiveness that modern terminals deserve.

Multi-line editing. Edit multi-line commands with full cursor movement, syntax highlighting across lines, and proper indentation. The feature that makes people think they need a terminal IDE.

Error highlighting. Commands turn red when they are invalid. Missing quotes, broken pipes, nonexistent commands, all highlighted before you press Enter.

And the performance? I just timed it on my own machine. Bash with ble.sh, vim-mode with visual indicators, fzf integration for completion and key-bindings and git, Starship prompt, Atuin for shell history, zoxide for smart directory jumping, direnv, mise, and tmuxinator auto-launching a session. That is not a minimal setup. That is a fully loaded, daily-driver, power-user configuration with every bell and whistle I actually use. 150 milliseconds. The whole thing. All of it. 150 milliseconds.

Your Oh My Zsh setup takes 2-4 seconds to give you less functionality than what this delivers in a tenth of that time. And half of your zsh plugins are reimplementing things that tools like fzf, zoxide, and Starship already do better and shell-independently. Let that sink in. The “primitive” shell with a pure-bash line editor and a full power-user toolkit boots faster than your “modern” shell boots with a plugin manager that exists because the shell cannot stand on its own.

How ble.sh Works And Why It Matters

What makes ble.sh remarkable is not just what it does but how it does it. Ble.sh is written entirely in bash script. No C extensions. No compiled binaries. No dependencies beyond bash itself. It hooks into bash’s readline interface and replaces it with its own line editor, implemented from scratch in pure bash.

This means ble.sh works everywhere bash works. SSH into a server? ble.sh works. Docker container? ble.sh works. Minimal Linux installation with nothing but coreutils? ble.sh works. It does not need Python. It does not need Rust. It does not need Node. It needs bash and that is it.

The author, Koichi Murase (akinomyoga), has essentially proved that the supposed limitations of bash as an interactive shell were not limitations of bash at all. They were limitations of readline, the default line-editing library. By replacing readline with a pure-bash implementation, ble.sh demonstrates that bash was always capable of providing a modern interactive experience. Nobody bothered to try because everyone was too busy writing new shells instead.

The Setup

Getting ble.sh running is embarrassingly simple:

# Install
git clone --recursive --depth 1 --shallow-submodules https://github.com/akinomyoga/ble.sh.git
make -C ble.sh install PREFIX=~/.local

# Add to .bashrc
echo 'source ~/.local/share/blesh/ble.sh' >> ~/.bashrc

That is it. Two commands. No plugin manager. No framework. No configuration rabbit hole. You source one file and your bash terminal transforms into something that makes fish look like a tech demo and Oh My Zsh look like a Rube Goldberg machine.

Want a nice prompt? Ble.sh has its own built-in prompt and status line system that you can configure without any external tools. Or use Starship if you prefer a shell-independent prompt. Either way, no framework required.

The Bottom Line

You never needed a new shell. You needed a better line editor. Ble.sh is that line editor. It gives you the interactive experience of fish and Zsh + Oh My Zsh while keeping the portability, compatibility, and universality of bash.

Use bash. Install ble.sh. Add Starship for a prompt if you want one. You will have a terminal experience that matches or exceeds the alternative shells, with none of the downsides: no compatibility breaks, no slow startup, no plugin dependency hell, no framework lock-in, and no knowledge that only works in one shell.

The shell-industrial complex convinced you that the most battle-tested, universally available, POSIX-compliant shell on earth was not good enough. They fed you the poison of dissatisfaction, then sold you their cure. And the entire time, the medicine was right there in /bin/bash, waiting for someone to write a proper line editor for it.

Akinomyoga did that. In bash. As a one-person project. And it is better than the combined output of multiple well-funded alternative shell projects with thousands of GitHub stars and conference talk circuits.

The adults have scripts to write. And those scripts start with #!/bin/bash.