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 在 开发工具
444 每月下载量
1MB
17K SLoC
brush
关于
brush
(Bo(u)rn(e) RUsty SHell) 是一个旨在与 POSIX Shell规范 和 bash 兼容的shell。它主要用于Linux,现在也提供了Windows和MacOS的实验性构建。
brush
可以用于交互式使用,作为日常驱动的shell。它可以执行我们遇到的大多数 sh
和 bash
脚本,但仍处于开发中,存在已知限制。因此,我们不推荐在生产环境中使用它,因为它可能与现有的稳定shell行为不同。(如果你发现任何行为差异,请通过问题报告它们!)
欢迎所有类型的贡献和反馈!有关更多指导,请参阅我们的 贡献指南。有关更多技术细节,请参阅此仓库中的 文档。
这个项目最初是出于好奇心和学习的愿望。如果随着时间的推移它变得有趣或有用,那将是一个额外的奖励 :)
许可证
在 MIT许可证 下可用和分发。
试试它!
我们尚未发布 brush
的二进制版本,但如果你已安装了工作的 rust
工具链,你可以简单地运行
cargo install --locked brush-shell
这将安装从 crates.io
最新的 brush
版本。另外,为了获取最新和最好的功能,您可以克隆此仓库并执行 cargo run
。
如果您还没有安装 rust
,我们建议通过 rustup
来安装它。
当您运行 brush
时,它应该看起来与您系统上的 bash
非常相似,因为它处理 .bashrc
和其他常规配置。如果您想将 brush
的外观定制以区别于您系统上安装的其他外壳,则还可以创建一个 ~/.brushrc
文件。
哪些功能正常工作?
简而言之,相当多。标准和扩展控制流、单词扩展、算术、大多数常用内置命令、管道、重定向、变量等。可编程完成功能正常,与标准 bash
完成脚本配合使用。
已知限制您可以在哪里提供帮助!
虽然有很多功能是正常工作的,但也有一些兼容性的已知差距。最值得注意的是
- 命令以作业的形式异步运行,作业管理。 您可以运行
some-command &
,但它的质量最多只是一个概念验证。通过fg
、bg
和jobs
的标准作业管理尚未完全实现。这将是热情的贡献者深入研究的绝佳领域 :). - 尊重
set
和shopt
选项(例如,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
- 异步,好吧,一切
还要向pprof
和criterion
项目表示巨大的赞赏和感谢,它们通过将cargo bench
的标准基准测试功能与它们无缝集成,实现了令人惊叹的火焰图。
链接:其他shell实现
这当然不是第一次尝试在非C/C++实现语言中实现功能丰富的POSIX shell。一些例子包括
我们确信还有更多;我们很高兴包括它们的链接。
依赖项
~15–46MB
~726K SLoC