4 个版本

0.4.4 2023 年 4 月 29 日
0.4.3 2021 年 8 月 12 日
0.4.1 2021 年 8 月 9 日
0.2.0 2018 年 10 月 15 日

#2110 in 解析器实现

38 每月下载量

MITCC-PDDC 许可证

125KB
2.5K SLoC

oursh

Documentation CI Dependencies

这个 shell 应该既兼容 POSIX,又现代且令人兴奋。特色功能不应因 POSIX 兼容性而被阻碍。这将影响 shell 的设计。

shell 的名字是 oursh,这个名字既独特又易于记忆。它还是一个很好的名字来玩伪讽刺主题... 对吧,同志?它很短(ish)并且巧妙地将 rs 放在其中,这是 Rust 程序的扩展名,这个 shell 将使用该语言编写。

特性

  • POSIX 兼容性
    • 简单命令 ls
    • 引号 (#28) "foo"; echo 'bar'
    • 赋值 LOG=trace cargo run
    • 变量 echo $foo
    • 特殊变量 ($54) echo $?; echo $1
    • 布尔状态语法 ! true && false || true
    • 条件语句 if ; then ; elif ; then ; else ; fi
    • 复合命令 { ls; date; }
    • 子 shell \$(sleep 1; date)
    • 后台任务 { sleep 1; date; }& date
    • 重定向 date > now.txt
    • 管道 ls | wc -l
  • Shebang块程序
    • 备选语法 {# ...}
    • Hashlang语法 {#lang; ...},例如 {#posix ls}
    • Shebang语法 {#!/usr/bin/env ruby; puts :sym}
  • bash/zsh自动完成兼容性
    • 命令完成
    • 路径完成
    • 变量完成
    • 作业完成
    • 语法完成
    • man / -h / --help 解析
  • 多行输入
  • 现代脚本语言
    • 类型
    • 高阶函数
    • 线程?
  • 加密字符串(!'password'!
  • 跟踪每个命令的时间
  • 类似mosh的远程会话支持
  • 智能历史记录,跨设备同步
  • 不重新运行而将旧命令管道传输
  • 软件包管理器
  • 合理的默认设置
  • 快速

版本,标签和分支

master分支将运行releaseci操作,而develop只运行ci。所有提交到master和带有发布标签(即vX.Y.Z)的推送到release也会触发release构建。

用法

尽管这个项目处于早期阶段,没有操作系统包可供使用。但是,您可以轻松地从源代码编译和运行。只需确保已安装rustup

cargo build
cargo run

测试

在这个程序中,我们有四种类型的测试。Crate单元测试,可执行单元测试,基于子进程的集成测试和文档测试。

# Run all tests.
cargo test

先前工作

我已经使用了fish作为我的主要shell几年了。Fish启发了许多现代语法。

POSIX兼容性来自于我想将这个shell作为我的Arch Linux上的chsh -s ...shell。有关更多信息,请参阅完整的POSIX参考。

部分Shell语言互操作性受到我在东北大学PL小组期间的经历启发,尤其是在编写Racket语言的过程中。将UNIX风格的#!...与Racket的#lang ...相结合,对我来说非常令人兴奋。我可能真的需要为Racket创建一个{#lang ...}快捷方式!

之前我已构建和编写了一些关于Shell的内容

POSIX参考

有关构建符合POSIX sh的程序语言和基于交互式终端的REPL的以下部分:

  • 3§2 Shell命令语言
    • 10.2 Shell语法规则
  • 2§2.5 标准I/O流
  • 3§1.6 内置工具
  • 3§1.4 工具描述默认值
  • 2§2.3 错误号
  • 1§11 通用终端接口
  • 2§2.4 信号概念

实现

此Shell将使用Rust编写,依赖性最少。值得注意的是termioslibc可能会被使用。解析库将是lalrpop,它应该能够相对容易地支持我们想要的语法,尽管语法通常是一个棘手的问题。

我们将为Shell创建几个内部模块。

此设计可能随时更改。

  • process - 子进程执行管理。
  • program - Shell语法的解析器和解释器。
    • posix - POSIX(类似sh)语法。
    • modern - 支持现代功能(如lambda)的修改版语法。
  • repl - 对底层终端的语法感知、读取评估打印循环。
    • history - 将以前的执行记录到共享数据库中。
    • completion - 根据部分语法搜索自动补全。
      • bash - bash补全支持。
      • zsh - zsh补全支持。
      • parse - 从man等生成的动态补全。
    • sync - 远程会话和数据库同步。
  • invocation - 加载.ourshrc和其他内容。
  • package - 简单的包管理器支持(内置函数)。

截至:2018-10-14 当前模块

 oursh : crate
 ├── job : public
 ├── program : public
 │   ├── basic : public
 │   └── posix : public
 │       ├── ast : public
 │       │   └── tests : private @ #[cfg(test)]
 │       ├── builtin : public
 │       └── lex : public
 │           └── tests : private @ #[cfg(test)]
 ├── repl : public
 │   ├── completion : public @ #[cfg(feature = "completion")]
 │   └── history : public @ #[cfg(feature = "history")]
 └── tests : private @ #[cfg(test)]└── tests : private @ #[cfg(test)]

依赖关系

~7–17MB
~222K SLoC