No description
  • Rust 98.6%
  • Python 1%
  • Handlebars 0.2%
  • Dockerfile 0.1%
  • Shell 0.1%
Find a file
Jane Rachinger 2985ecfb47
Some checks failed
CodeQL Advanced / Analyze (rust) (push) Has been cancelled
Devcontainer / Build and publish devcontainer (push) Has been cancelled
Docs / Check links (push) Has been cancelled
Docs / Generate usage docs (push) Has been cancelled
GitHub Actions Security Analysis with zizmor 🌈 / zizmor latest via PyPI (push) Has been cancelled
CI / External tests / bash-completion test suite (push) Has been cancelled
CI / OS target tests (Arch Linux/latest) (push) Has been cancelled
CI / OS target tests (Debian/testing) (push) Has been cancelled
CI / Benchmarks (push) Has been cancelled
Devcontainer / Build devcontainer (push) Has been cancelled
CI / Check for unneeded dependencies (push) Has been cancelled
CI / Build (aarch64/macos) (push) Has been cancelled
CI / Build (aarch64/linux) (push) Has been cancelled
CI / Build (wasm32/unknown) (push) Has been cancelled
CI / Build (wasm32/wasi-0.2) (push) Has been cancelled
CI / Build (x86_64/linux) (push) Has been cancelled
CI / Build (x86_64/linux-musl) (push) Has been cancelled
CI / Build (x86_64/windows) (push) Has been cancelled
CI / Test (macOS) (push) Has been cancelled
CI / Test (linux/aarch64) (push) Has been cancelled
CI / Test (linux/x86_64) (push) Has been cancelled
CI / Source code checks (push) Has been cancelled
CI / Source code checks-1 (push) Has been cancelled
CI / Source code checks-2 (push) Has been cancelled
CI / Source code checks-3 (push) Has been cancelled
CI / Source code checks-4 (push) Has been cancelled
CI / Source code checks-5 (push) Has been cancelled
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
CI / OS target tests (Fedora/latest) (push) Has been cancelled
CI / OS target tests (Azure Linux/3.0) (push) Has been cancelled
CI / OS target tests (NixOS/latest) (push) Has been cancelled
CI / OS target tests (openSUSE Tumbleweed/latest) (push) Has been cancelled
add dry_run
2026-03-10 03:17:23 +01:00
.cargo perf: avoid CPU-specific optimization (#600) 2025-07-04 11:11:09 -07:00
.config fix: assorted completion issues with ~ and vars (#199) 2024-10-12 13:54:15 -07:00
.devcontainer chore: add some tools to devcontainer (#595) 2025-07-01 07:48:03 +00:00
.github build(deps): bump the github-actions group with 5 updates (#681) 2025-09-14 19:17:57 -07:00
.vscode chore: address warnings on windows targets (#663) 2025-08-27 20:13:30 -07:00
brush-core add dry_run 2026-03-10 03:17:23 +01:00
brush-interactive build(deps): bump the cargo group with 4 updates (#676) 2025-09-13 22:55:24 -07:00
brush-parser build(deps): bump serde from 1.0.221 to 1.0.223 in the cargo group (#680) 2025-09-14 19:04:33 -07:00
brush-shell build(deps): bump serde from 1.0.221 to 1.0.223 in the cargo group (#680) 2025-09-14 19:04:33 -07:00
docs chore: add pattern and expansion tests to track newly filed issues (#330) 2025-01-19 11:49:13 -08:00
fuzz build(deps): bump the cargo group with 4 updates (#676) 2025-09-13 22:55:24 -07:00
scripts chore: remove another unused global variable (#637) 2025-08-11 23:36:02 -07:00
xtask build(deps): bump the cargo group with 4 updates (#676) 2025-09-13 22:55:24 -07:00
.cliffignore feat: add basic changelog 2024-06-18 08:30:54 -07:00
.gitignore test: move to cargo nextest (#176) 2024-09-30 03:49:49 +00:00
.lycheeignore docs: correct broken link in readme (#67) 2024-06-11 09:22:06 -07:00
Cargo.lock build(deps): bump serde from 1.0.221 to 1.0.223 in the cargo group (#680) 2025-09-14 19:04:33 -07:00
Cargo.toml fix: correct obvious string indexing errors (#641) 2025-08-13 08:19:47 -07:00
CHANGELOG.md chore: prepare release (#668) 2025-08-30 00:57:06 -07:00
cliff.toml feat: add basic changelog 2024-06-18 08:30:54 -07:00
CODE_OF_CONDUCT.md Docs update (#40) 2024-06-03 18:16:46 +00:00
CONTRIBUTING.md docs: fill out TBD sections in CONTRIBUTING.md + add extension suggestions (#397) 2025-03-09 17:05:55 +00:00
deny.toml feat(diag): add minimal miette support to parser (#648) 2025-08-19 09:08:12 -07:00
LICENSE Minor docs changes (#47) 2024-06-07 18:24:32 +00:00
README.md docs: update readme (#657) 2025-08-23 03:05:15 -07:00
release-plz.toml fix: add missing tokio feature required by brush-core (#506) 2025-05-22 20:57:40 +00:00
rustfmt.toml chore: upgrade crates to Rust 2024 edition (#554) 2025-06-12 12:47:42 -07:00
zizmor.yml ci: pin rust-toolchain tasks (#635) 2025-08-11 23:17:06 -07:00



Packaging status Dependency status Discord invite


brush (Bo(u)rn(e) RUsty SHell) is a POSIX- and bash-compatible shell, implemented in Rust. It's built and tested on Linux, macOS, and WSL. Native Windows support is experimental.

brush is functional for interactive use as a daily driver! It executes most sh and bash scripts we've encountered. Known limitations are tracked with filed issues. Out of an abundance of caution, we wouldn't recommend using it yet in production scenarios in case it doesn't behave identically to your existing stable shell. (If you do find any behavioral differences, though, please report them with an issue!)

Contributions and feedback of all kinds are welcome! For more guidance, please consult our contribution guidelines. For more technical details, please consult the documentation in this repo.

This project was originally borne out of curiosity and a desire to learn. We're doing our best to keep that attitude :).


📝 License

Available for use and distribution under the MIT license.

⌨️ Installation

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.

🚀 Installing prebuilt binaries from GitHub

We publish prebuilt binaries of brush for Linux (x86_64, aarch64) and macOS (aarch64) to GitHub for official releases. 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/brush
🚀 Installing prebuilt binaries via `cargo binstall`

You may use cargo binstall to install pre-built brush binaries. Once you've installed cargo-binstall you can run:

cargo binstall brush-shell
🔨 Installing from sources

To build from sources, first install a working (and recent) rust toolchain; we recommend installing it via rustup. Then run:

cargo install --locked brush-shell
🐧 Installing using Nix

If you are a Nix user, you can use the registered version:

nix run 'github:NixOS/nixpkgs/nixpkgs-unstable#brush' -- --version
🐧 Installing on Arch Linux

Arch Linux users can install brush from the official extra repository:

pacman -S brush
🍺 Installing using Homebrew

Homebrew users can install using the brush formula:

brew install brush

👥 Community

brush has a community Discord server, available here.

🔍 Known limitations

There are some known gaps in compatibility. Most notably:

  • Some set and shopt options. The set builtin is implemented, as is set -x and many frequently used set/shopt options, but a number aren't fully implemented. For example, set -e will execute but its semantics aren't applied across execution.

If you're interested, we'd love contributions to improve compatibility, broaden test coverage, or really any other opportunities you can find to help us make this project better.

🧪 Testing strategy

This project is primarily tested by comparing its behavior with other existing shells, leveraging the latter as test oracles. The integration tests implemented in this repo include 675+ test cases run on both this shell and an oracle, comparing standard output and exit codes.

For more details, please consult the reference documentation on integration testing.

🙏 Credits

There's a long list of OSS crates whose shoulders this project rests on. Notably, the following crates are directly relied on for major portions of shell functionality:

  • reedline - for readline-like input and interactive usage
  • clap - command-line parsing, used both by the top-level brush CLI as well as built-in commands
  • fancy-regex - relied on for everything regex
  • tokio - async, well, everything
  • nix rust crate - higher-level APIs for Unix/POSIX system APIs

For testing, performance benchmarking, and other important engineering support, we use and love:

There are a number of other POSIX-ish shells implemented in a non-C/C++ implementation language. Some inspirational examples include:

We're sure there are plenty more; we're happy to include links to them as well.