#shell #bash #script #sh

brush-parser

POSIX/bash shell 分词器和解析器(由 brush-shell 使用)

5 个版本

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

开发工具 中排名 603

Download history 133/week @ 2024-06-09 393/week @ 2024-06-16 9/week @ 2024-06-23 157/week @ 2024-06-30 9/week @ 2024-07-07 99/week @ 2024-07-14 157/week @ 2024-07-21 63/week @ 2024-07-28 1/week @ 2024-08-04 5/week @ 2024-08-11

每月下载量 254
3 crates 中使用

MIT 许可协议

200KB
3.5K 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),其中许多只支持它们最常用的选项,而少数则根本没有实现。

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

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

测试策略

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

有关更多详情,请参考集成测试参考文档

致谢

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

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

还要向pprofcriterion项目表示巨大的敬意和感谢,它们使在cargo bench的标准基准测试功能中实现出色的火焰图成为可能。

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

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

依赖关系

~0.7–1.4MB
~26K SLoC