1 个不稳定版本

0.0.0 2021年9月23日

#98#step

GPL-3.0-or-later

30KB
599

Shrimp

Shellzao Rust 实现

测试

cargotest ----test-threads=1

设计笔记

通用

  • 基本执行单元是管道。
  • 管道由步骤组成(其他Shell有时使用“简单命令”作为术语)。
  • 步骤可以是内置函数或外部程序
  • 重定向(以及可能管道?)需要空白作为分隔符

步骤

  • 作为枚举实现,而不是特质
    • 已知和有限数量的变体(要么是内置的,要么是外部命令)
    • 不需要可扩展性(特质和特质对象的主要用途之一)
    • 由于缺乏动态调度,比特质对象更高效(至少在理论上如此,不确定在这种情况下影响有多大)
  • 管道通过传递字节流(Vec<u8>)将一个步骤的输出与下一个步骤的输入连接起来
    • 灵活,我们可以使用 Read 读取器和 Write 写入器

来源

内置命令

  • cd <path> 将 'path' 目录设置为当前目录
  • exit 终止 foosh
  • quit 与 exit 相同
  • fg [job-id] 将由 jobid 标识的工作发送到前台。如果未指定 jobid,则默认为最近修改状态的工作。
  • bg [job-id] 将由 jobid 标识的工作发送到后台。如果未指定 jobid,则默认为最近修改状态的工作。
  • jobs 输出当前活动工作的列表。如果内置命令与外部程序的名称冲突,则内置命令优先 —— 除非显式给出程序路径。
  • echo

基本功能

  • 命令执行:内置和外部
  • 管道
  • IO 重定向
  • 后台执行/作业管理
  • 基本脚本

更多功能

  • 提示符自定义
  • 配置文件/带有变量的配置
  • 历史记录
  • 扩展
  • 正确的解析

高级功能

无实施保证

  • 与bash的脚本兼容性
  • 自动补全
  • 解析(词法分析器 -> 解析器)

词法分析器

  • 词法分析器将输入分割成标记。
  • 词法分析器将逐个读取输入字符,并尝试将其与每个标记匹配
  • 正则表达式描述每个标记

无运行时依赖