Amber:将编写 bash 脚本变成真正的编程
每当一个普通的 bash 脚本增长到五十行时,代码库中就会开始一场静默的噩梦。变量周围的引号、条件语句中括号周围的空格、不可预测的错误处理,以及在脚本投入生产环境之前编译器完全沉默。我们已经学会了忍受这些,因为 shell 脚本可以在任何地方运行,无需安装 Python 或 Node.js 这样的运行时环境。
最近发现了 Amber——一个高级编程语言编译器,它将代码直接转换为干净的 Bash。这个想法看起来如此实用,让人不禁想知道为什么我们没有早点这样做?
这个项目是什么,为什么你需要它
Amber 解决了一个熟悉的痛点:让开发者使用现代语法、严格类型检查、构建时检查和便捷的字符串处理,同时保持最终产物是一个普通的文本脚本。生成的 .sh 文件可以部署到任何 Linux 服务器或在任何最小化的 Docker 容器中运行。那里只需要标准的 Bash 解释器,不需要其他任何东西。
编译器使用 Rust 编写,运行速度快,启用安全模式时生成可读的 shell 代码 set -e。
Amber 代码长什么样
该语言的语法借鉴了 Rust、TypeScript 和熟悉的 shell 命令的优点。以下是一些立即引起注意的显著特性:
正确的类型化和清晰的变量
不再有 export 魔法和转义,而是使用常规类型:Text、Num、Bool 和数组。
let name = "Alex"
let age = 30
let is_admin = true
echo "Пользователь: {name}, возраст: {age}"
编译器自动检查类型,不会让你在需要数字的地方传入字符串。
安全执行 shell 命令
该语言的主要特性是与系统工具的无缝集成。命令直接写在代码中的 $ 符号内或代码块中,编译器监控返回码。
let output = $curl -s https://api.github.com$ failed {
echo "Ошибка загрузки данных"
exit 1
}
echo "Полученный ответ: {output}"
failed 结构强制你显式处理命令以非零状态退出的情况。不再会因为有人忘记检查工具的退出码而在部署过程中意外崩溃。
带有返回值的正确函数
在纯 Bash 中,函数除了数字状态码或通过 stdout 输出到 echo 外,无法正确返回值。在 Amber 中,函数的工作方式符合程序员的预期:
fun calculate_disk_usage(path: Text): Num {
let raw = $df {path} | awk 'NR==2 {print $5}' | tr -d '%'$?
return parse_num(raw)
}
这在实践中有什么用
Amber 主要为云基础设施和自动化而设计。
- CI/CD 流水线。当构建步骤对于 YAML 中的三行代码来说太复杂,但又不想引入带依赖的 Python 时。Amber 在开发者机器或 CI 运行器上构建为单个二进制文件,然后一个现成的
.sh可以部署到目标系统。 - Cloud-init 和 VM 初始化脚本。服务器准备脚本经常因为环境变量中的拼写错误而失败。编译前的静态分析可以让你免于数十次重启干净实例。
- 服务器系统工具。编写可靠的监控工具或日志轮转脚本,保证可以在任何服务器上运行,无需安装第三方包。
美中不足
项目作者诚实地在仓库开头放置了警告:该语言仍在积极开发中,尚未准备好大规模生产使用。语法可能还会发生变化,团队目前正在完善 shell 代码生成中的一些罕见边缘情况。
如果你决定在真实工作中尝试 Amber,在关键机器上运行之前检查生成的 bash 代码是很有必要的。幸运的是,生成的脚本保持开放且易于理解。
值得一试吗
如果你经常用 Bash 编写自动化脚本,厌倦了捕捉引号和空格相关的奇怪 bug——那答案绝对是肯定的。Amber 给你一种真正现代开发的感觉,而在此之前你只能与一个有着三十年历史的标准搏斗。试着重写你 CI 中的几个辅助脚本,看看可读性和可靠性的差异。
相关项目