1 个不稳定版本
0.0.0 | 2021年9月23日 |
---|
#98 在 #step
30KB
599 行
Shrimp
Shellzao Rust 实现
测试
cargotest ----test-threads=1
设计笔记
通用
- 基本执行单元是管道。
- 管道由步骤组成(其他Shell有时使用“简单命令”作为术语)。
- 步骤可以是内置函数或外部程序
- 重定向(以及可能管道?)需要空白作为分隔符
步骤
- 作为枚举实现,而不是特质
- 已知和有限数量的变体(要么是内置的,要么是外部命令)
- 不需要可扩展性(特质和特质对象的主要用途之一)
- 由于缺乏动态调度,比特质对象更高效(至少在理论上如此,不确定在这种情况下影响有多大)
- 管道通过传递字节流(
Vec<u8>
)将一个步骤的输出与下一个步骤的输入连接起来- 灵活,我们可以使用
Read
读取器和Write
写入器
- 灵活,我们可以使用
来源
- https://gitlab.com/monaco/posixeg/-/blob/master/exercises/shell/foosh.txt
- https://doc.rust-lang.net.cn/std/process/index.html
- https://www.joshmcguigan.com/blog/build-your-own-shell-rust/
- https://www.gnu.org/software/bash/manual/html_node/Basic-Shell-Features.html#Basic-Shell-Features
- https://github.com/psinghal20/rush
- https://hyperpolyglot.org/unix-shells
- http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html
- https://github.com/Swoorup/mysh
- https://adriann.github.io/rust_parser.html
内置命令
cd <path>
将 'path' 目录设置为当前目录exit
终止 fooshquit
与 exit 相同fg [job-id]
将由 jobid 标识的工作发送到前台。如果未指定 jobid,则默认为最近修改状态的工作。bg [job-id]
将由 jobid 标识的工作发送到后台。如果未指定 jobid,则默认为最近修改状态的工作。jobs
输出当前活动工作的列表。如果内置命令与外部程序的名称冲突,则内置命令优先 —— 除非显式给出程序路径。echo
基本功能
- 命令执行:内置和外部
- 管道
- IO 重定向
- 后台执行/作业管理
- 基本脚本
更多功能
- 提示符自定义
- 配置文件/带有变量的配置
- 历史记录
- 扩展
- 正确的解析
高级功能
无实施保证
- 与bash的脚本兼容性
- 自动补全
- 解析(词法分析器 -> 解析器)
词法分析器
- 词法分析器将输入分割成标记。
- 词法分析器将逐个读取输入字符,并尝试将其与每个标记匹配
- 正则表达式描述每个标记