#shell #bash #script #sh #cli

brush-interactive

brush-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日

#1518 in 开发工具

Download history 141/week @ 2024-06-09 171/week @ 2024-06-16 7/week @ 2024-06-23 134/week @ 2024-06-30 5/week @ 2024-07-07 92/week @ 2024-07-14 263/week @ 2024-07-21 87/week @ 2024-07-28 2/week @ 2024-08-04

444 每月下载量
用于 brush-shell

MIT 许可证

780KB
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 可以作为日常驱动器进行交互式使用。它可以执行我们遇到的大多数 shbash 脚本,但仍然是一个正在进行的工程,存在已知的限制。因此,我们目前不推荐在生产环境中使用它,因为它可能不会与您现有的稳定 shell 以相同的方式表现。(如果您发现任何行为差异,请通过问题报告它们!)

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

这个项目最初是出于好奇和学习欲望而开始的。如果随着时间的推移证明它是有趣或有用的,那将是一个额外的奖励 :).

许可证

MIT 许可证 下可用。

试试它!

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

cargo install --locked brush-shell

这将安装来自 crates.io 的最新发布的 brush 版本。或者,为了获取最新和最好的代码,您可以克隆此仓库并执行 cargo run

如果您没有安装 rust,我们建议通过 rustup 进行安装。

当你运行 brush 时,它应该看起来与你的系统上 bash 的外观非常相似,因为它会处理 .bashrc 和其他常规配置。如果你想自定义 brush 的外观以区分系统中安装的其他shell,你还可以创建一个 ~/.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 问题跟踪的,但在代码库中散布着许多这样的内容。其中一些表明可能很容易实现的缺失功能;而另一些则可能涉及需要设计工作的跨领域挑战。这些包括一些shell内置函数。其中一些已完全实现(例如echo),许多只支持它们最常用的选项,而少数根本未实现。

当然还有更多的差距;随着时间的推移,我们将找到一种方法以某种可理解的方式表示这些差距。理想情况下,我们希望逐步完善测试套件,添加所有已知缺失部分的测试。这将使我们能够专注于只是 "修复测试"。

我们绝对欢迎你帮助解决上述任何问题,扩大测试覆盖率,更深入地评估兼容性,或者你能够找到的任何其他机会来帮助使这个项目变得更好。

测试策略

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

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

致谢

有许多开源项目为该项目提供了支持。特别值得一提的是,以下项目直接用于shell功能的主要部分:

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

还要向pprofcriterion项目表示巨大敬意和感谢,它们使通过与cargo bench的标准基准测试功能无缝集成,实现了出色的火焰图。

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

我们确信还有更多,我们很高兴将它们的链接也包括在内。

依赖项

~14–45MB
~702K SLoC