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 每月下载量
125KB
2.5K SLoC
oursh
这个 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
分支将运行release
和ci
操作,而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的内容
rush
计算机架构的辉煌家庭作业shell.py
计算机组织a8的提交- 构建Shell - 第1部分 此项目的开始
- 构建Shell - 第2部分
program
模块介绍
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编写,依赖性最少。值得注意的是termios和libc可能会被使用。解析库将是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