CLI 用法
Zx 提供了一个 CLI 用于运行脚本。它随软件包一起提供,可以作为 zx
可执行文件使用(如果在 package.json 的 "scripts"
中引用,全局安装,或以某种方式添加到 $PATH
中)。
zx script.mjs
npx
或 node
初始化也是有效的。
npx zx script.mjs
node -r zx/globals script.mjs
node --import zx/globals script.mjs
无扩展名
如果脚本没有文件扩展名(例如 .git/hooks/pre-commit
),zx 假定它是一个 ESM 模块,除非指定了 --ext
选项。
非标准扩展名
zx
在内部通过 import
API 加载脚本,因此您可以使用运行时(nodejs、deno、bun)支持的任何扩展名,或者应用自定义加载器。但是,如果脚本具有非 js 类的扩展名 (/^\.[mc]?[jt]sx?$/
) 并且指定了 --ext
,则将使用它。
zx script.zx # Unknown file extension "\.zx"
zx --ext=mjs script.zx # OK
Markdown
CLI 支持 markdown 文件并将 ts
、js
和 bash
代码块解释为脚本。
zx docs/markdown.md
远程脚本
如果 zx
可执行文件的参数以 https://
开头,则将下载并执行该文件。
zx https://medv.io/game-of-life.js
来自 stdin 的脚本
zx
支持从 stdin 执行脚本。
zx << 'EOF'
await $`pwd`
EOF
--eval
将以下参数评估为脚本。
cat package.json | zx --eval 'const v = JSON.parse(await stdin()).version; echo(v)'
--repl
在 REPL 模式下启动 zx。
--install
// script.mjs:
import sh from 'tinysh'
sh.say('Hello, world!')
将 --install
标志添加到 zx
命令以自动安装缺少的依赖项。
zx --install script.mjs
您还可以通过在导入后添加带有 @
的注释来指定所需的版本。
import sh from 'tinysh' // @^1
--registry
默认情况下,zx
使用 https://registry.npmjs.org
作为注册表。 如果需要,可以自定义。
zx --registry=https://registry.yarnpkg.com script.mjs
--quiet
禁止任何输出。
--verbose
启用详细模式。
--shell
指定自定义 shell 二进制文件路径。 默认情况下,zx 引用 bash
。
zx --shell=/bin/another/sh script.mjs
--prefer-local, -l
优先使用本地安装的软件包和二进制文件。
zx --prefer-local=/external/node_modules/or/nm-root script.mjs
--prefix & --postfix
将命令附加到每个命令的开头或结尾。
zx --prefix='echo foo;' --postfix='; echo bar' script.mjs
--cwd
设置当前工作目录。
zx --cwd=/foo/bar script.mjs
--env
指定一个 env 文件。
zx --env=/path/to/some.env script.mjs
当指定 cwd
选项时,它将用作基本路径--cwd='/foo/bar' --env='../.env'
→ /foo/.env
--ext
覆盖默认脚本扩展名 (.mjs
)。
--version, -v
打印当前的 zx
版本。
--help, -h
打印帮助信息。
环境变量
所有先前提到的选项都可以通过相应的 ZX_
前缀环境变量来设置。
ZX_VERBOSE=true ZX_SHELL='/bin/bash' zx script.mjs
steps:
- name: Run script
run: zx script.mjs
env:
ZX_VERBOSE: true
ZX_SHELL: '/bin/bash'
__filename & __dirname
在 ESM 模块中,Node.js 不提供 __filename
和 __dirname
全局变量。由于这样的全局变量在脚本中非常方便,因此 zx 提供了这些全局变量,以便在 .mjs
文件中使用(当使用 zx
可执行文件时)。
require()
在 ESM 模块中,未定义 require()
函数。 zx
提供了 require()
函数,因此它可以与 .mjs
文件中的导入一起使用(当使用 zx
可执行文件时)。
const {version} = require('./package.json')