bash/POSIX-compatible shell implemented in Rust
brush (Bo(u)rn(e) RUsty SHell) is a modern bash- and POSIX- compatible shell written in Rust. Run your existing scripts and .bashrc unchanged -- with syntax highlighting and auto-suggestions built in.
✅ Your existing .bashrc just works—aliases, functions, completions, all of it.
✨ Syntax highlighting and auto-suggestions built in.
Validated against bash with ~1700 compatibility tests.
Easily embeddable in your Rust apps using brush_core::Shell.
⚠️ Not everything works yet:
selectand some edge cases aren't supported. See the Compatibility Reference for details.
$ curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/reubeno/brush/main/scripts/install/install.sh | sh
$ cargo binstall brush-shell # using cargo-binstall
$ brew install brush # using Homebrew
$ pacman -S brush # Arch Linux
$ cargo install --locked brush-shell # Build from sourcesbrush is ready for use as a daily driver. We test every change against bash to keep it that way.
More detailed installation instructions are available below.
bash Compatibility| Feature | Description | |
|---|---|---|
| ✅ | 50+ builtins | echo, declare, read, complete, trap, ulimit, ... |
| ✅ | Full expansions | brace, parameter, arithmetic, command/process substitution, globs, extglob, globstar |
| ✅ | Control flow | if/for/while/until/case, &&/||, subshells, pipelines, etc. |
| ✅ | Redirection | here docs, here strings, fd duplication, process substitution redirects |
| ✅ | Arrays & variables | indexed/associative arrays, dynamic variables, standard well-known variables, etc. |
| ✅ | Programmable completion | Works with bash-completion out of the box |
| ✅ | Job control | background jobs, suspend/resume, fg/bg/jobs |
| Traps & options | DEBUG/ERR/EXIT traps work; signal traps and options in progress |
| Feature | Description | |
|---|---|---|
| ✅ | Syntax highlighting | Real-time as you type (reedline) |
| ✅ | Auto-suggestions | History-based hints as you type (reedline) |
| ✅ | Rich prompts | PS1/PROMPT_COMMAND, right prompts, starship compatible |
| ✅ | TOML config | ~/.config/brush/config.toml for persistent settings |
| Extras | fzf/atuin support, zsh-style precmd/preexec hooks (experimental), VS Code terminal integration |
When you run brush, it should look exactly as bash does on your system: it processes your .bashrc and
other standard configuration. If you'd like to distinguish the look of brush from the other shells
on your system, you may author a ~/.brushrc file.
Homebrew users can install using the brush formula:
brew install brushArch Linux users can install brush from the official extra repository:
pacman -S brushMSYS2 users can install brush from the repository:
pacman -S mingw-w64-ucrt-x86_64-brush # or mingw-w64-clang-x86_64-brush or mingw-w64-clang-aarch64-brushYou may use cargo binstall to install pre-built brush binaries. Once you've installed cargo-binstall you can run:
cargo binstall brush-shellWe publish prebuilt binaries of brush for Linux (x86_64, aarch64) and macOS (x86_64, aarch64) to GitHub for official releases. The simplest way to install one is with our install script, which installs brush to ~/.local/bin:
curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/reubeno/brush/main/scripts/install/install.sh | shThe script checks the download against its published SHA-256 checksum, which guards against a corrupted download but not a compromised release (the checksum comes from the same release). If an authenticated GitHub CLI is available, it also verifies the archive's build provenance attestation, confirming it was built by this repository's release workflow; pass --require-attestation to fail rather than proceed when that check can't be performed. See the comments at the top of scripts/install/install.sh for all options. Alternatively, you can manually download and extract the brush binary from one of the archives published there, or otherwise use the GitHub CLI to download it, e.g.:
gh release download --repo reubeno/brush --pattern "brush-x86_64-unknown-linux-gnu.*"After downloading the archive for your platform, you may verify its authenticity using the GitHub CLI, e.g.:
gh attestation verify brush-x86_64-unknown-linux-gnu.tar.gz --repo reubeno/brushIf you are a Nix user, you can use the registered version:
nix run 'github:NixOS/nixpkgs/nixpkgs-unstable#brush' -- --versionbrush isn't packaged in Fedora's official repositories, but a community-maintained brush-shell package is available from Terra, a separately maintained, third-party repository for Fedora and its derivatives.
Once you've enabled the Terra repository:
dnf install brush-shellTo build from sources, first install a working (and recent) rust toolchain; we recommend installing it via rustup. Then run:
cargo install --locked brush-shellThis project started out of curiosity and a desire to learn—we're keeping that attitude. If something doesn't work the way you'd expect, let us know!
Other POSIX-ish shells implemented in non-C/C++ languages:
nushell — modern Rust shell (provides reedline)fish — user-friendly shell (Rust port in 4.0)Oils — bash-compatible with new Oil languagemvdan/sh — Go implementationrusty_bash — another Rust bash-like shellThis project relies on many excellent OSS crates:
reedline — readline-like input and interactive featuresclap — command-line parsingfancy-regex — regex supporttokio — async runtimenix — Unix/POSIX APIscriterion.rs — benchmarkingbash-completion — completion test suiteLicensed under the MIT license.
No open issues yet, or sync has not completed.