如何从 shell 脚本调用 deno?

How do I invoke deno from a shell script?

我有一个脚本想要 运行...可能是这样的:

#!/usr/bin/env deno

console.log('hello world');

shebang 部分令人困惑。当我按照上面的方式使用文件名 dev 时,我得到:

error: Found argument './dev' which wasn't expected, or isn't valid in this context

当我尝试将 shebang 更改为 #!/usr/bin/env deno run

我明白了

/usr/bin/env: ‘deno run’: No such file or directory

关于如何实现这一点有什么想法吗?

为了通过 env 将命令选项传递给 deno,您需要 env.-S 参数。

例如,以下是您应该使用的最小 shebang,用于使用 Deno 自运行创建脚本。

#!/usr/bin/env -S deno run

复杂示例:

以下 script/shebang 将尽可能安静地 运行 Deno,具有所有权限,并假设脚本文件旁边有一个 import_map.json 文件。

#!/usr/bin/env -S deno -q run --allow-all --import-map="${_}/../import_map.json"

// get file and directory name
const __filename = import.meta.url.replace("file://", "");
const __dirname = __filename.split("/").slice(0, -1).join("/");

带有 __filename__dirname 的行将为您提供类似于 Node 执行的变量。


脚本安装程序

Deno 还提供了一种方便的方法,用于在配置的分发位置安装脚本及其权限和依赖项。

参见:Deno Manual - Script installer

独立可执行文件

从 Deno 1.6 开始,您现在也可以从脚本构建独立的可执行文件。

参见:Deno Manual - Compiler - Compiling Executables

Deno 1.6.0

可以编译成独立的二进制/可执行文件,不需要自定义 Shebang:

$ deno compile --unstable main.js 
# or add custom output path
$ deno compile --unstable main.js -o /my/path/main
# both create ./main executable (e.g. on Linux)

# execute script directly
$ ./main 

更多信息