index.ts
特性
- 跨平台:可在 Windows、Linux 和 macOS 上运行。无需安装
rimraf或cross-env,您可以使用 Bun Shell。常见 shell 命令如ls、cd和rm都已原生实现。 - 熟悉:Bun Shell 是一个类 bash shell,支持重定向、管道和环境变量。
- Glob 模式:原生支持 glob 模式,包括
**、*和{expansion}。 - 模板字面量:模板字面量执行 shell 命令并插值变量和表达式。
- 安全性:Bun Shell 默认转义所有字符串,防止 shell 注入攻击。
- JavaScript 互操作:使用
Response、ArrayBuffer、Blob、Bun.file(path)和其他 JavaScript 对象作为 stdin、stdout 和 stderr。 - Shell 脚本:Bun Shell 运行 shell 脚本(
.bun.sh文件)。 - 自定义解释器:Bun Shell 是一个小型编程语言,拥有自己的词法分析器、解析器和解释器,使用 Rust 编写。
快速入门
最简单的 shell 命令是echo。要运行它,请使用 $ 模板字面量标签:
.quiet():
.text():
await 会返回 stdout 和 stderr 作为 Buffer。
错误处理
默认情况下,非零退出代码会抛出错误。ShellError 包含所运行命令的信息。
.nothrow() 禁用抛出。您可以自己检查结果的 exitCode。
$ 函数本身上调用 .nothrow() 或 .throws(boolean)。
重定向
使用典型的 Bash 运算符重定向命令的输入或输出:<重定向 stdin>或1>重定向 stdout2>重定向 stderr&>重定向 stdout 和 stderr 两者>>或1>>重定向 stdout,追加到目标,而不是覆盖2>>重定向 stderr,追加到目标,而不是覆盖&>>重定向 stdout 和 stderr 两者,追加到目标,而不是覆盖1>&2将 stdout 重定向到 stderr(写入 stdout 的内容改为写入 stderr)2>&1将 stderr 重定向到 stdout(写入 stderr 的内容改为写入 stdout)
示例:将输出重定向到 JavaScript 对象(>)
要将 stdout 重定向到 JavaScript 对象,请使用 > 运算符:
Buffer、Uint8Array、Uint16Array、Uint32Array、Int8Array、Int16Array、Int32Array、Float32Array、Float64Array、ArrayBuffer、SharedArrayBuffer(写入底层缓冲区)Bun.file(path)、Bun.file(fd)(写入文件)
示例:从 JavaScript 对象重定向输入(<)
要将 JavaScript 对象用作 stdin,请使用 < 运算符:
Buffer、Uint8Array、Uint16Array、Uint32Array、Int8Array、Int16Array、Int32Array、Float32Array、Float64Array、ArrayBuffer、SharedArrayBuffer(从底层缓冲区读取)Bun.file(path)、Bun.file(fd)(从文件读取)Response(从 body 读取)
示例:重定向 stdin -> 文件
示例:重定向 stdout -> 文件
示例:重定向 stderr -> 文件
示例:重定向 stderr -> stdout
示例:重定向 stdout -> stderr
管道(|)
与 bash 类似,您可以将一个命令的输出通过管道传递给另一个命令:
命令替换($(...))
命令替换将另一个命令的输出插入到当前脚本中:
环境变量
像 bash 一样设置环境变量:更改环境变量
默认情况下,所有命令都使用process.env 作为其环境变量。
要更改单个命令的环境变量,请调用 .env():
$.env:
$.env():
更改工作目录
要更改命令的工作目录,请将字符串传递给.cwd():
$.cwd:
读取输出
要将命令的输出作为字符串读取,请使用.text():
将输出读取为 JSON
要将命令的输出作为 JSON 读取,请使用.json():
逐行读取输出
要逐行读取命令的输出,请使用.lines():
.lines():
将输出读取为 Blob
要将命令的输出作为 Blob 读取,请使用.blob():
内置命令
为跨平台兼容性,Bun Shell 实现了一组内置命令,此外还可以从PATH 环境变量读取命令。
cd:更改工作目录ls:列出目录中的文件(支持-l长列表格式)rm:删除文件和目录echo:打印文本pwd:打印工作目录bun:在 bun 中运行 buncattouchmkdirwhichmvexittruefalseyesseqdirnamebasename
mv:移动文件和目录(缺少跨设备支持)
- 查看 Issue #9716 获取完整列表。
工具函数
Bun Shell 还实现了一组用于处理 shell 的工具函数。$.braces(花括号展开)
$.braces 实现了 shell 命令的花括号展开:
$.escape(转义字符串)
将 Bun Shell 的转义逻辑暴露为函数:
{ raw: 'str' } 对象中:
.sh 文件加载器
对于简单的 shell 脚本,您可以使用 Bun Shell 代替 /bin/sh。将带有 .sh 扩展名的文件传递给 bun:
script.sh
terminal
powershell
实现说明
Bun Shell 是一个用 Rust 实现的小型编程语言,拥有手写的词法分析器、解析器和解释器。与 bash、zsh 和其他 shell 不同,Bun Shell 并发运行操作。Bun Shell 的安全机制
Bun Shell 有意不调用系统 shell(如/bin/sh)。它是 bash 的重新实现,运行在同一个 Bun 进程中。
解析命令参数时,它会将所有插值变量视为单个字面量字符串。
这可以防止命令注入:
userInput 被视为单个字符串,因此 ls 尝试读取名为 my-file.txt; rm -rf / 的单个目录的内容。
安全注意事项
虽然默认情况下防止了命令注入,但在某些场景下您仍需负责安全。 与Bun.spawn 或 node:child_process.exec() API 类似,您可以有意执行一个启动新 shell 的命令(例如 bash -c)并附带参数。
当您这样做时,您移交了控制权,Bun 的内置保护不再适用于该新 shell 解释的字符串。
参数注入
Bun Shell 无法知道外部命令如何解释其自身的命令行参数。攻击者可以提供目标程序识别为其自身选项或标志的输入,从而导致意外行为。建议:在将用户提供的输入作为参数传递给外部命令之前,始终进行清理。验证参数是您应用程序的责任。