Brush (Bo(u)rn(e) RUsty SHell) a POSIX and Bash-Compatible Shell in Rust
Brush (Bo(u)rn(e) RUsty SHell):一个用 Rust 实现的兼容 POSIX 和 Bash 的 Shell
brush
(B o(u)rn(e) RUsty SHell) 是一个用 Rust 实现的,兼容 POSIX 和 bash 的 shell。 它构建并测试于 Linux 和 macOS 上,并对 Windows 提供实验性支持。(其 Linux 构建版本完全支持通过 WSL 在 Windows 上运行。)
brush
作为日常驱动程序在交互式使用方面是有效的! 它可以执行我们遇到的大多数 sh
和 bash
脚本。 已知的限制会通过提交 issue 跟踪。 出于谨慎考虑,我们不建议在 生产 场景中使用它,以防其行为与您现有的稳定 shell 不完全相同。(如果您确实发现了任何行为差异,请通过 issue 报告!)
欢迎各种贡献和反馈! 有关更多指导,请查阅我们的贡献指南。 有关更多技术细节,请参阅此 repo 中的文档。
该项目最初源于好奇心和学习的愿望。 我们正在尽最大努力保持这种态度 :)。
许可证
可在 MIT 许可证 下使用和分发。
尝试一下!
我们不发布 brush
的二进制版本,但是如果您安装了可用的 rust
工具链,则只需运行:
cargo install --locked brush-shell
这将从 crates.io
安装最新发布的 brush
版本。 另外,对于最新版本,您可以克隆此 repo 并执行 cargo run
。
(如果您 有 兴趣拥有二进制版本,请在项目的“Discussions”区域中告知我们,或在“Issues”中提交功能请求。)
如果您是 Nix 用户,您也可以使用已注册的版本。
nix run 'github:NixOS/nixpkgs/nixpkgs-unstable#brush' -- --version
Arch Linux 用户可以使用他们选择的 AUR 助手 从 AUR 安装 brush
,例如:
paru -S brush
运行 brush
时,它应该看起来与系统上的 bash
完全一样,因为它会处理 .bashrc
和其他常用配置。 如果您想自定义 brush
的外观以使其与系统上安装的其他 shell 区分开来,则还可以编写 ~/.brushrc
文件。
已知限制
兼容性方面存在一些已知的差距。 最值得注意的是:
- 一些
set
和shopt
选项。set
内置函数已实现,set -x
和许多常用的set
/shopt
选项也已实现,但是许多选项尚未完全实现。 例如,set -e
将执行,但是其语义不会在整个执行过程中应用。 - 带有
TODO
注释标记的任何内容,或者使用error::unimp()
返回“未实现”错误的任何内容。 这些并非都在当前通过 GitHub issues 进行跟踪,但是代码库中散布着许多此类注释。 有些指示可能很容易实现的功能缺失; 其他可能更复杂。
如果您愿意,我们非常欢迎您为以上任何一项做出贡献,包括扩大测试范围,更深入地评估兼容性,或者您可以找到的任何其他机会来帮助我们使该项目变得更好。
测试策略
该项目主要通过将其行为与其他现有 shell 进行比较来测试,并利用后者作为测试预言机。 在此 repo 中实现的集成测试包括 550 多个测试用例,这些用例在此 shell 和预言机上运行,比较标准输出和退出代码。
有关更多详细信息,请查阅有关集成测试的参考文档。
鸣谢
这个项目建立在许多 OSS crate 的肩膀上。 值得注意的是,以下 crate 被直接依赖于 shell 功能的主要部分:
reedline
(https://github.com/nushell/reedline) - 用于 readline 样式的输入和交互式使用clap
(https://github.com/clap-rs/clap) - 命令行解析,由顶级 brush CLI 以及内置命令使用fancy-regex
(https://github.com/fancy-regex/fancy-regex) - 依赖于所有 regextokio
(https://github.com/tokio-rs/tokio) - 异步,嗯,一切nix
rust crate - 用于 Unix / POSIX 系统 API 的更高级别的 API
对于测试,性能基准测试和其他重要的工程支持,我们使用并喜欢:
pprof-rs
(https://github.com/tikv/pprof-rs) - 用于基于采样的 CPU 分析criterion.rs
(https://github.com/bheisler/criterion.rs) - 用于基于统计的基准测试bash-completion
(https://github.com/scop/bash-completion) - 用于其完成测试套件和一般完成支持!
链接:其他 shell 实现
还有许多其他的 POSIX-ish shell 是用非 C/C++ 实现语言实现的。 一些鼓舞人心的例子包括:
nushell
(https://www.nushell.sh/) - 现代的 Rust 实现的 shell (也提供我们使用的reedline
crate!)rusty_bash
(https://github.com/shellgei/rusty_bash)mvdan/sh
(https://github.com/mvdan/sh)
我们确信还有更多; 我们也很乐意包括指向它们的链接。