01 Languages & frameworks
Bash
Already installed on every machine you will ever be asked to fix.
- Role
- Shell & glue
- Licence
- GPL v3
- Since
- 1989
- Upstream
- Project site ↗
Bash is unfashionable and it is not going anywhere. It is on every server, in every container and in every rescue shell, and it is the first thing available at three in the morning when something is wrong.
Why we still choose it
For glue code, being available everywhere matters more than elegance. A deployment hook, a backup rotation, a restore test or a health check written in Bash runs anywhere without a runtime to install, and whoever is on call can read it regardless of what other languages they know.
It also makes for an easier handover. A client who inherits fifty lines of Bash can maintain them. If the same logic is written in a framework they do not use, they will probably end up replacing it.
How we write it
Carefully, because Bash punishes carelessness. Every script we hand over starts
with set -euo pipefail, quotes its variables, uses trap for cleanup, and is
checked by ShellCheck in CI like any other lint. We keep scripts short as a
matter of policy; once one grows past a page of logic, we rewrite it in Ruby.
Where it falls short
As a general-purpose language Bash is bad. Arrays are awkward, error handling is a convention rather than a feature, and the quoting rules have ended careers. We use it for glue and orchestration, keep it small, and move to a proper language as soon as data structures are involved.