index.ts
特性
- 跨平台:支持 Windows、Linux 和 macOS。无需安装
rimraf或cross-env,你可以使用 Bun Shell。ls、cd和rm等常见 shell 命令均已原生实现。 - 熟悉易用:Bun Shell 是一个类 bash shell,支持重定向、管道和环境变量。
- Glob:原生支持 Glob 模式,包括
**、*和{expansion}。 - 模板字面量:模板字面量可以执行 shell 命令,并插入变量和表达式。
- 安全性:Bun Shell 默认会转义所有字符串,防止 shell 注入攻击。
- JavaScript 互操作性:使用
Response、ArrayBuffer、Blob、Bun.file(path)及其他 JavaScript 对象作为标准输入、标准输出和标准错误。 - 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 重定向到 JS 对象:
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 形式读取输出:
内置命令
为了兼容跨平台环境,除了从PATH 环境变量中读取命令外,Bun Shell 还实现了一组内置命令。
cd:切换工作目录ls:列出目录文件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 无法知晓外部命令如何解释其自身的命令行参数。攻击者可以提供目标程序会识别为自身选项或标志的输入,从而导致非预期行为。建议:始终清理用户提供的输入,然后再将其作为参数传递给外部命令。
验证参数是应用程序的责任。