01 Languages & frameworks
Bash
The one language that is 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 not fashionable and it is not going anywhere. It is on every server, in every container, 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
Because reach beats elegance for glue code. A deployment hook, a backup rotation, a restore test, a health check — written in Bash, these run anywhere without a runtime to install, and can be read by whoever is on call regardless of what languages they know.
It is also the honest choice for a handover. A client who inherits fifty lines of Bash can maintain them. The same logic expressed through a framework they do not use is something they will quietly replace.
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. Scripts are short by policy —
if one grows past a page of logic, that is the signal it wanted to be Ruby.
The honest limit
Bash is a bad general-purpose language. 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, deliberately keep it small, and move to a real language the moment there is data structure involved.