The Bun Shell
Bun has introduced a JavaScript-integrated shell that reimplements common commands like `rm`, `ls`, and `cd` in Zig to offer fast, cross‑platform scripting without relying on the system’s shell or coreutils. Commenters see value for package.json scripts and JS-heavy workflows, comparing it to tools like zx, Execa, and Deno’s dax, but raise concerns about partial POSIX/GNU compatibility, leaky abstractions, security pitfalls, and the long‑term maintenance burden of such a broad surface area. The debate touches on whether shell semantics should be recreated inside general-purpose languages at all, or whether more focused, library-based abstractions would be a cleaner solution.
Purpose and Design
- Bun Shell exposes a
$tagged-template API to run shell-like commands from JavaScript/TypeScript and in the CLI. - It reimplements common commands (
cd,rm,ls,mv,which,pwd, globbing, env vars, pipes, redirection) in Zig inside the Bun runtime rather than delegating to the system shell. - Intended to make package.json scripts and small automation tasks more ergonomic and cross‑platform, especially things like
rm -rfthat fail on Windows.
Comparison to Existing JS Shell Tools
- Frequently compared to
zx,execa,dax,bsx,shelljs. - Key differentiator: Bun has its own shell and built‑ins, while most libraries still invoke
bash/PowerShell and suffer from their availability and performance quirks. - API is seen as very similar to
zx, and Bun’s docs explicitly cite those tools as inspiration.
Compatibility and Semantics
- Several commenters worry about partial, non‑POSIX behavior and “uncanny valley” semantics: commands look like familiar Unix tools but may differ in flags, behavior, and edge cases (file names, encodings, colors, TTY, timestamps).
- Questions about whether it aims to be POSIX‑compatible or a strict GNU coreutils match; the answer is unclear, and some argue this should be documented as a compatibility policy.
- There is concern about future changes where new built‑ins might silently override system utilities.
Security and “Eval” Concerns
- Some compare it to
eval; others point out tagged templates separate code from data and auto‑escape interpolated variables, reducing command‑injection risks. - Skeptics still expect eventual “templating vs. interpolation” mistakes and note that running shell strings inside another language remains a risky abstraction.
Performance
- Bun avoids repeated shell startup by keeping everything in one runtime; this appeals to users who have seen Node’s
child_processslow down under heavy spawning. - Debate over whether shell startup cost is actually significant; some benchmarks show shells starting in sub‑millisecond ranges on many systems.
Adoption, Scope, and Sustainability
- Enthusiasts like that Bun “just builds useful stuff” and find the JS+shell blend attractive for replacing long bash scripts.
- Others are uneasy that Bun is attempting many things (runtime, bundler, test runner, shell) while being VC‑funded, questioning long‑term maintenance of a large surface area.
- Windows support is currently experimental, which undercuts the cross‑platform story for now and confuses some readers.
Alternatives and Bigger Picture
- Multiple alternatives are mentioned:
shx,bsx, Nushell, Murex, Go/Python/Kotlin scripting, and various “shell but in X language” projects. - Broader debate: whether shell scripting should be replaced by richer languages (JS, Python, Go, Kotlin) versus keeping shells and coreutils as the fundamental abstraction layer.