Actually, I should clarify — I have a love-hate relationship with Bash. Mostly hate. But also, deep, begrudging respect.
It’s 2026. We have Rust CLIs that run at the speed of light. We have AI agents that can generate entire Python microservices while I make coffee. Yet, open any repository—backend, frontend, infrastructure, doesn’t matter—and look at the .github/workflows or the deploy/ folder. What do you see?
Shell scripts. Everywhere.
Bash is the cockroach of the programming world. It survives everything. It survives the “Rewrite it in Go” movement. It survives the “Python is easier” argument. It survives because sometimes you just need to glue three commands together and piping output is faster than importing subprocess in Python.
The problem isn’t Bash itself. The problem is that most of us write Bash like we’re drunk. We ignore errors, we let variables expand into dangerous whitespace, and we create unmaintainable sprawling messes that explode the moment a file name has a space in it.
I spent last Tuesday debugging a silent failure in a CI pipeline running on Ubuntu 24.04. The script exited with code 0 (success), but the deployment didn’t happen. Why? Because a command in the middle of a pipe failed, and Bash, by default, only cares about the exit code of the last command in the pipe.
But for that deployment glue? For that Docker entrypoint? For that quick CI check? Bash is still king. Just treat it with the same discipline you treat your application code. Use strict mode. Quote your variables. And for the love of everything holy, handle your errors.




