1 个不稳定版本
0.0.0 | 2023年7月19日 |
---|
#52 in #subset
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