#subset #interpreter #compiler #redirect

app ba-sh

Bash解释器/编译器。可能不会支持所有功能。

1个不稳定版本

0.0.0 2023年7月23日

#53 in #subset

MIT 许可证

85KB
2.5K SLoC

SBash

描述

严格的bash shell,编译器和解释器。设计为以最小依赖使用作为Linux交互式shell,并将bash脚本编译为独立的静态二进制文件。将仅支持bash语法的子集。

待办事项

  • repl模式中的eval
  • repl模式中的内置命令
  • 从外部文件中源
  • 实现别名
  • 使用管道链式命令
  • 将命令输出赋值给变量
  • 使用单一模型输出命令/内置命令/函数
  • 实现重定向
  • 实现if/for块
  • 完成自动补全
  • 从上一个命令的终端输出中复制
  • 逐步执行,带有深度控制,显示命令并等待
  • 选项:自动将命令输出重定向到文件

特性

  • 不是posix shell
  • 快速编译
  • 无依赖项的静态编译
  • 支持独特的bash语法进行变量/函数声明
  • 不能覆盖函数,首先是定义
  • 局部变量(以小写字母开头)不会传播到函数外部
  • 没有默认值的函数参数被认为是强制性的
  • 调用函数时缺少强制参数将出错
  • 尝试访问未定义的变量将出错
  • 始终假设在$之后有{,并且括号/括号正确关闭
  • 仅有一级子命令
  • 子命令只能用于双引号字符串的开头
  • 子命令限于变量/单词和重定向符号
  • 不支持(目前?)多行字符串
  • 变量必须始终带引号
  • 内置命令作为简单的rust函数实现(+可能使用宏简化?)
  • 没有外部配置或可控制的隐藏变量
  • 函数不能创建新的全局变量
  • 函数参数必须在函数开头分配给局部变量
  • 执行从main函数开始

限制

  • 可能在某些边缘情况下失败
  • 不支持嵌套引号
  • 尚未支持重定向
  • 仅支持${alpha_or_num},不支持$@或$*或任何其他形式
  • 用户定义函数的最大参数数为9
  • 尚未支持if/while/for
  • 尚未支持数学,如果需要,可能作为内置命令实现

目标

  • 使用作用域和默认值解析bash变量
  • 通过function关键字解析bash函数
  • 支持外部命令和函数的调用
  • 实现基本bash功能的子集
  • 支持stdout/err重定向和管道

构建

    cargo build --target x86_64-unknown-linux-musl --release

其他

fix some warnings
    cargo fix --allow-dirty

没有运行时依赖项