zx 是 Google 开发的用 JavaScript/TypeScript 编写 shell 脚本的工具。它封装了 child_process,能自动转义参数并提供合理默认值,让你在脚本中使用 JavaScript 生态的强大能力。本技能提供使用 zx 编写 shell 脚本的综合指南。
快速开始: 通过 npm install zx 安装。将脚本写成 .mjs 文件(支持顶层 await),添加 #!/usr/bin/env zx shebang 或通过 CLI 运行: zx ./script.mjs npx zx ./script.mjs node --import zx/globals 在 zx 脚本中,所有函数($、cd、fetch 等)全局可用,无需导入。如需显式导入(获得更好的 VS Code 自动补全),可使用 import 'zx/globals'。
核心概念:
$command 是 zx 的核心,作为标签模板字面量执行 shell 命令。${...} 中的内容会自动转义并加引号。支持异步(返回 ProcessPromise)和同步($.syncpwd 返回 ProcessOutput)两种变体。数组会被展平,非零退出码会抛出 ProcessOutput。可通过 $({...}) 创建带预设选项的自定义 $ 实例,且预设可链式组合。
ProcessPromise 与 ProcessOutput: ProcessPromise 继承自 Promise,提供 .pipe() 流管道、.kill() 终止进程、.text()/.json()/.lines() 输出格式化、.nothrow() 抑制错误、.quiet() 抑制输出、.timeout() 超时自动终止、.stdio() 配置 I/O,以及 .exitCode、.stdout、.stderr、.stdin、.pid、.cmd 等属性。await 后得到 ProcessOutput,包含 .stdout、.stderr、.exitCode、.signal、.text()/.json()/.lines()/.buffer()/.blob() 和 .ok(在 nothrow 模式下)。
编写有效的 zx 脚本:
支持并行执行(Promise.all)、使用 nothrow 进行错误处理、流管道(.pipe($next) 或 .pipe('file.txt'))、流拆分与合并、输出格式化(.json()/.lines()/.text())、异步迭代(for await...of)。zx 默认使用 bash,可通过 useBash()、usePowerShell()、usePwsh() 切换 shell,或手动设置 $.shell。在 Windows 上,建议使用 WSL 或 Git Bash,或切换到 PowerShell。
内置辅助函数: 包括 cd() 切换目录、fetch() 发起 HTTP 请求、question() 交互式输入、sleep() 延迟、echo() 打印、stdin() 读取标准输入、within() 隔离异步配置上下文、retry() 重试、spinner() 进度指示、glob() 文件匹配、which() 查找可执行文件路径、ps 跨平台进程列表、tmpdir()/tmpfile() 临时文件/目录、argv 解析 CLI 参数、dotenv 加载 .env 文件。还暴露了 chalk、fs、os、path、YAML、minimist 等 npm 包。
资源: references/api.md 提供完整 API 参考;references/configuration.md 列出所有 $.options;references/cli.md 说明 CLI 用法(标志、环境变量、Markdown 脚本、远程脚本、stdin 执行、REPL 模式);references/process.md 讲解 ProcessPromise/ProcessOutput 生命周期、管道、终止、中止、输出格式化和流处理。