#shell #bash #script #sh #cli

app brush-shell

Rust实现,专注于POSIX和bash兼容性的shell

6个版本

0.2.6 2024年7月23日
0.2.5 2024年7月23日
0.2.2 2024年6月19日
0.1.0 2024年6月11日

#584开发工具

Download history 117/week @ 2024-06-06 151/week @ 2024-06-13 51/week @ 2024-06-20 96/week @ 2024-06-27 76/week @ 2024-07-04 302/week @ 2024-07-18 135/week @ 2024-07-25 7/week @ 2024-08-01

444 每月下载量

MIT 许可证

1MB
17K SLoC

brush

Crates.io Crates.io License CI workflow badge Devcontainer workflow badge

关于

brush (Bo(u)rn(e) RUsty SHell) 是一个旨在与 POSIX Shell规范bash 兼容的shell。它主要用于Linux,现在也提供了Windows和MacOS的实验性构建。

screenshot

brush 可以用于交互式使用,作为日常驱动的shell。它可以执行我们遇到的大多数 shbash 脚本,但仍处于开发中,存在已知限制。因此,我们不推荐在生产环境中使用它,因为它可能与现有的稳定shell行为不同。(如果你发现任何行为差异,请通过问题报告它们!)

欢迎所有类型的贡献和反馈!有关更多指导,请参阅我们的 贡献指南。有关更多技术细节,请参阅此仓库中的 文档

这个项目最初是出于好奇心和学习的愿望。如果随着时间的推移它变得有趣或有用,那将是一个额外的奖励 :)

许可证

MIT许可证 下可用和分发。

试试它!

我们尚未发布 brush 的二进制版本,但如果你已安装了工作的 rust 工具链,你可以简单地运行

cargo install --locked brush-shell

这将安装从 crates.io 最新的 brush 版本。另外,为了获取最新和最好的功能,您可以克隆此仓库并执行 cargo run

如果您还没有安装 rust,我们建议通过 rustup 来安装它。

当您运行 brush 时,它应该看起来与您系统上的 bash 非常相似,因为它处理 .bashrc 和其他常规配置。如果您想将 brush 的外观定制以区别于您系统上安装的其他外壳,则还可以创建一个 ~/.brushrc 文件。

哪些功能正常工作?

简而言之,相当多。标准和扩展控制流、单词扩展、算术、大多数常用内置命令、管道、重定向、变量等。可编程完成功能正常,与标准 bash 完成脚本配合使用。

已知限制您可以在哪里提供帮助!

虽然有很多功能是正常工作的,但也有一些兼容性的已知差距。最值得注意的是

  • 命令以作业的形式异步运行,作业管理。 您可以运行 some-command &,但它的质量最多只是一个概念验证。通过 fgbgjobs 的标准作业管理尚未完全实现。这将是热情的贡献者深入研究的绝佳领域 :).
  • 尊重 setshopt 选项(例如,set -e)。 set 内置函数已实现,同样 set -x 和一些其他选项也已实现,但大多数行为尚未实现。set -e 例如,将执行但它的语义不会在执行中应用。
  • 大括号扩展。 大多数扩展形式都已实现;由于某种原因,我们从未着手实现将 {a,b} 扩展为 a b 的扩展。甚至还有一个测试用例,但它被标记为已知失败的测试。
  • 标记化程序和解析器的边缘情况。 为了简单性和易于开始,brush 的标记化程序是手动实现的,而解析器是使用 rust-peg 实现的。(也要向那个项目大声说一声谢谢!)有一些边缘情况变得复杂,可能没有以 100% 的保真度实现(例如,算术表达式中的复杂嵌套括号表达式,进一步嵌套在命令替换内部)。所有测试在这些领域都通过,但覆盖率有限。增加测试覆盖率将是这个领域的贡献的一个很好的起点。
  • 带有 TODO 注释的内容或使用 error::unimp() 返回“未实现”错误的地方。 这些现在还没有用 GitHub 问题跟踪,但代码库中散布着许多这样的例子。其中一些表明可能很容易实现的缺失功能;其他可能涉及需要设计工作的跨切面挑战。这包括一些外壳内置函数。一些是完全和完全实现的(例如 echo),其中一些仅支持它们最常用的选项,而少数根本未实现。

当然还有更多差距;随着时间的推移,我们将找到一种方式来以可理解的方式表示这些差距。理想情况下,我们希望将测试套件发展到包括所有已知缺失部分的测试。这将使我们能够专注于仅“修复测试”。

我们非常欢迎您在上述任何方面提供帮助,包括扩大测试覆盖率、更深入的兼容性评估,或者您能找到的任何其他机会来帮助使这个项目变得更好。

测试策略

本项目主要通过将其行为与现有shell进行比较进行测试,利用后者作为测试预言机。在这个存储库中实现的集成测试包括300+测试用例,在shell和预言机上运行,比较标准输出和退出码。

有关更多详细信息,请参阅集成测试参考文档

鸣谢

有许多开源crate支持了这个项目,其中一些crate直接依赖于shell功能的主要部分

  • rustyline - 用于readline输入和交互式使用
  • clap - 命令行解析,由顶级brush CLI和内置命令使用
  • fancy-regex - 依赖于所有正则表达式
  • tokio - 异步,好吧,一切

还要向pprofcriterion项目表示巨大的赞赏和感谢,它们通过将cargo bench的标准基准测试功能与它们无缝集成,实现了令人惊叹的火焰图。

这当然不是第一次尝试在非C/C++实现语言中实现功能丰富的POSIX shell。一些例子包括

我们确信还有更多;我们很高兴包括它们的链接。

依赖项

~15–46MB
~726K SLoC