https://github.com/reubeno/brush
Rust-implemented shell focused on POSIX / bash compatibility
https://github.com/reubeno/brush
bash posix-shell rust script shell
Last synced: about 1 month ago
JSON representation
Rust-implemented shell focused on POSIX / bash compatibility
- Host: GitHub
- URL: https://github.com/reubeno/brush
- Owner: reubeno
- License: mit
- Created: 2024-05-10T06:17:52.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-10-18T18:49:11.000Z (12 months ago)
- Last Synced: 2024-10-19T12:37:09.939Z (12 months ago)
- Topics: bash, posix-shell, rust, script, shell
- Language: Rust
- Homepage:
- Size: 1.36 MB
- Stars: 17
- Watchers: 1
- Forks: 4
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
- awesome-starred - reubeno/brush - ๐bash/POSIX-compatible shell implemented in Rust ๐ฆ (Rust)
- awesome-rust - brush-shell - bash/POSIX-compatible shell [](https://github.com/reubeno/brush/actions/workflows/ci.yaml)[](https://crates.io/crates/brush-shell) (Applications / System tools)
- fucking-awesome-rust - brush-shell - bash/POSIX-compatible shell [](https://github.com/reubeno/brush/actions/workflows/ci.yaml)[](https://crates.io/crates/brush-shell) (Applications / System tools)
- awesome-ccamel - reubeno/brush - ๐bash/POSIX-compatible shell implemented in Rust ๐ฆ (Rust)
README
![]()
`brush` (**B**o(u)rn(e) **RU**sty **SH**ell) is a [POSIX-](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html) and [bash-](https://www.gnu.org/software/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](CONTRIBUTING.md). For more technical details, please consult the
[documentation](docs/README.md) 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](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](https://github.com/reubeno/brush/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.:
```bash
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](https://cli.github.com/), e.g.:
```bash
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](https://github.com/cargo-bins/cargo-binstall) to install pre-built `brush` binaries. Once you've installed `cargo-binstall` you can run:
```bash
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`](https://rustup.rs/). Then run:
```bash
cargo install --locked brush-shell
```๐ง Installing using Nix
If you are a Nix user, you can use the registered version:
```bash
nix run 'github:NixOS/nixpkgs/nixpkgs-unstable#brush' -- --version
```๐ง Installing on Arch Linux
Arch Linux users can install `brush` from the official [extra repository](https://archlinux.org/packages/extra/x86_64/brush/):
```bash
pacman -S brush
```๐บ Installing using Homebrew
Homebrew users can install using [the `brush` formula](https://formulae.brew.sh/formula/brush):
```bash
brew install brush
```## ๐ฅ Community
`brush` has a community Discord server, available [here](https://discord.gg/kPRgC9j3Tj).
## ๐ 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.* **The `history` builtin and support for programmatically manipulating command history.**
This is something we're actively working on, with promises for supporting shell extensions like [atuin](https://atuin.sh/).If you feel so inclined, we'd love contributions toward any of the above, with broadening test coverage, deeper compatibility evaluation, 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](brush-shell/tests/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](docs/reference/integration-testing.md).
## ๐ 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`](https://github.com/nushell/reedline) - for readline-like input and interactive usage
* [`clap`](https://github.com/clap-rs/clap) - command-line parsing, used both by the top-level brush CLI as well as built-in commands
* [`fancy-regex`](https://github.com/fancy-regex/fancy-regex) - relied on for everything regex
* [`tokio`](https://github.com/tokio-rs/tokio) - async, well, everything
* [`nix` rust crate](https://github.com/nix-rust/nix) - higher-level APIs for Unix/POSIX system APIsFor testing, performance benchmarking, and other important engineering support, we use and love:
* [`pprof-rs`](https://github.com/tikv/pprof-rs) - for sampling-based CPU profiling
* [`criterion.rs`](https://github.com/bheisler/criterion.rs) - for statistics-based benchmarking
* [`bash-completion`](https://github.com/scop/bash-completion) - for its completion test suite and general completion support!## ๐ Links: other shell implementations
There are a number of other POSIX-ish shells implemented in a non-C/C++ implementation language. Some inspirational examples include:
* [`nushell`](https://www.nushell.sh/) - modern Rust-implemented shell (which also provides the `reedline` crate we use!)
* [`rusty_bash`](https://github.com/shellgei/rusty_bash)
* [`mvdan/sh`](https://github.com/mvdan/sh)
* [`Oils`](https://github.com/oils-for-unix/oils)
* [`fish`](https://fishshell.com) ([as of 4.0](https://fishshell.com/blog/rustport/))We're sure there are plenty more; we're happy to include links to them as well.