#shell #bash #script #sh #cli

brush-core

POSIX/bash shell 的可重用核心(由 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日

开发工具 中排名 1021

Download history 139/week @ 2024-06-09 172/week @ 2024-06-16 7/week @ 2024-06-23 150/week @ 2024-06-30 10/week @ 2024-07-07 94/week @ 2024-07-14 252/week @ 2024-07-21 68/week @ 2024-07-28 2/week @ 2024-08-04

每月下载量 416
用于 2 crates

MIT 许可协议

755KB
16K 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 的外观以区分您系统上安装的其他外壳,那么您也可以创建一个 ~/.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功能的主要部分:

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

还要向pprofcriterion项目表示巨大敬意和感谢,它们使得在cargo bench的标准基准测试设施中无缝集成令人惊叹的火焰图成为可能。

这当然不是在非C/C++实现语言中实现功能丰富的POSIX外壳的第一尝试。以下是一些示例:

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

依赖项

~12–43MB
~677K SLoC