2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

五分钟了解 Node.js Shebang

  • 2020-09-11
  • 本文字数:2018 字

    阅读完需:约 7 分钟

五分钟了解 Node.js Shebang

本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。



JavaScript是一种解释性语言,需要将其源代码提供给某些解释器才能运行。如果要使用Node.js运行 JavaScript 文件,通常会运行以下命令:


$ node yourfile.js
复制代码


输入解释器(node)的名称后,你就明确告诉了外壳如何运行脚本。


但是这些知识可以放在脚本本身中,这样就可以像运行二进制文件一样直接运行它:


$ ./yourfile.js
复制代码


仅当你对该文件有执行权限(例如,可以使用 chmod u+x yourfile.js 设置)并设置了正确的“Shebang”时,此方法才有效。

Shebang

Shebang 或 hashbang(#!代码的英文发音)是文件的第一行,它告诉 OS 使用哪个解释器。它通常看起来像这样:


#!/absolute/path/to/the/interpreter [optional params]
复制代码


Shebang 是一项操作系统特性,可用于运行任何解释语言:Python、Perl 等。对于 Node.js,它可以(但通常不会)看起来像这样:


#!/usr/bin/node
复制代码


只有 Shebang 在文件的第一行时,Node.js 才会高兴地将其忽略为注释(即使它前面有空行或//comment 行也不会起作用)。浏览器也会将其忽略(Chrome74+,FF67+)。


多数人在/usr/bin/node 上都有一个 Node.js 二进制文件或符号链接。如果 Node.js 不在/usr/bin/node 上,操作系统就会抱怨了。例如 bash 会说 bad interpreter: No such file or directory script won’t execute。但有没有办法告诉操作系统使用 Node.js 运行脚本,而不用在乎它安装在哪里呢?


#!node是没用的,因为 Shebang 需要绝对路径。

认识一下 env 吧

env 主要用于在修改后的环境中运行命令。这里的重点是“命令”,因为 env 几乎总是位于/usr/bin/env,而“命令”可以是 PATH 上的任何内容。


如果我们不是写/usr/bin/node 而是写/usr/bin/env node,我们就会告诉 OS 运行 env,而 env 将运行 node,最后 node 将依次执行脚本。

简单来说

这是 Node 脚本最常见的 Shebang:


#!/usr/bin/env node
复制代码


但是,env 还可以使用其他一些技巧。

将参数传递给 Node.js

将-S 选项传递给 env 会使它解析之后发生的一切,从而打开一扇新的大门:将参数传递给命令。


例如,假设我们要运行带有特殊标志的 node,以在运行当前文件时启用 ESM 模块。我们可以使用这个 Shebang:


#!/usr/bin/env -S node --experimental-module
复制代码


再举一个例子:如果我们想在运行当前脚本之前运行另一个脚本,可以使用 Node 的-r 选项:


#!/usr/bin/env -S node -r ./my/other/file.js
复制代码


或打开检查口:


#!/usr/bin/env -S node --inspect
复制代码


请注意,如果你运行诸如 nodeyourfile.js 之类的脚本,Node.js 将不会尝试解析 Shebang 中的参数,而只会忽略它。内核在运行文件之前使用 Shebang 来确定如何运行它。

设置环境变量

还记得我们说过 env 可以在修改后的环境中运行命令吗?实际上这就是它名称的来源,而且它的功能非常强大。假设我们希望脚本以生产模式运行,我们可以设置 NODE_ENV 环境变量:


#!/usr/bin/env -S NODE_ENV=production node
复制代码


否则,运行脚本时 NODE_ENV 将为 undefined 或使用用户终端的设置。


Node.js支持许多环境变量。例如,我们可以使用 NODE_OPTIONS 传递下列 CLI 标志:


#!/usr/bin/env -S NODE_OPTIONS=--experimental-modules node
复制代码

从一个空环境开始

如果我们希望脚本在运行时不访问用户终端上的任何环境变量,则可以使用-i 标志来运行它,该标志代表“忽略环境”:


#!/usr/bin/env -S -i node
复制代码


符号-相当于-i,所以我们也可以这样写:


#!/usr/bin/env -S - node
复制代码

强制禁用 DEBUG

也许我们不想清除所有环境变量,但要屏蔽其中一些。例如 DEBUG(如果你使用的是流行的 debug 包)。也许我们不希望脚本用户将 DEBUG 作为脚本运行时设置标志。那么我们使用-u 标志代表未设置的环境变量。


#!/usr/bin/env -S -u=DEBUG - node
复制代码


如果用户以DEBUG=* ./yourfile.js运行脚本,他们将看不到任何调试信息,但你还是可以用DEBUG=* node ./yourfile.js运行脚本,从而看到 DEBUG 输出。

锁定 Node.js 运行时版本

有时你想锁定用于运行脚本的 node 版本。在 NPM@3 之前,我们可以使用 engineStrict,但是该功能已移除,现在我们只能在package.json中设置engines,它可能位于脚本旁边也可能不在,取决于 engine-strictconfig 配置标志的设置。


但是有一种更简单的方法。由于 node 也是 NPM 包,并且 npx 允许运行任何 NPM 包,因此你可以编写:


#!/usr/bin/env -S npx node@6
复制代码


这可能会在运行脚本后尝试下载请求的 Node 版本(因此,如果 NPX 缓存中不存在所请求版本的 Node,则无法在没有互联网连接的情况下运行)。


提示:你可以使用 process.version 检查节点版本

使用 TypeScript 运行它

没有规则说我们必须运行 node。假设TypeScript和 TS Node 全局可用(npm -i g typescript ts-node),我们可以指定 ts-node 作为解释器:


#!/usr/bin/env ts-node
复制代码


并让它作为 TypeScript 程序运行文件。


在这些示例中,文件都可以使用.js 扩展名或你喜欢的其他任何文件类型,甚至可以没有扩展!


原文链接:《Node Shebang》


2020-09-11 09:575167

评论

发布
暂无评论
发现更多内容

开启 Kerberos 安全认证的大数据环境中如何正确指定 HS2 的 jdbc url 地址?

明哥的IT随笔

大数据 hive kerberos

ICCV 2023|小红书 4 篇入选论文亮点解读,「开集视频目标分割」获得 Oral

小红书技术REDtech

算法 ICCV

用友系列之 YonBuilder 低代码平台概论和基本使用

YonBuilder低代码开发平台

低代码 可视化

写SAE评测,获 Airpods 2大奖【集结令】!

Serverless Devs

Serverless 云原生 AIGC

如何访问TDH中Inceptor 底层的元数据库TxSQL

明哥的IT随笔

大数据 hive

跨网传输文件时,如何通过日志记录来审计追溯?

镭速

跨网文件传输

Redis内存碎片:深度解析与优化策略

Java随想录

Java redis

福利贴|这是一个程序员不看一定会后悔的问题

Zilliz

非结构化数据 Milvus Zilliz 向量数据库

彻底告别传统FTP,新的替代FTP产品比你想象的好的多

镭速

传输协议 FTP传输替代方案

WorkPlus私有化部署IM即时通讯平台,构建高效安全的局域网办公环境

BeeWorks

rabbitMQ到底是个啥东西?

程序员万金游

Java 开发 #java Rabbit MQ

IoTDB 在国际数据库性能测试排行榜中位居第一?测试环境复现与流程详解第一弹!

Apache IoTDB

OpenHarmony自定义组件介绍

OpenHarmony开发者

OpenHarmony

上新啦!腾讯云云原生数据湖产品DLC 2.2.5版本发布,来看特性详解

腾讯云大数据

数据湖

从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!

不叫猫先生

百度智能云 千帆大模型平台

Generative AI 新世界 | 扩散模型原理的代码实践之采样篇

亚马逊云科技 (Amazon Web Services)

机器学习 #人工智能 生成式人工智能 Amazon SageMaker 大语言模型

Java训练营毕业总结

jjn0703

华为云API对话机器人CBS的魅力—要是有AI,我要做“李白”- 5分钟开发作诗机器人

华为云PaaS服务小智

云计算 软件开发 华为云

HarmonyOS使用多线程并发能力开发

HarmonyOS开发者

HarmonyOS

华为阅读“鲁迅专栏”已上线,读国内名家作品就上华为阅读

最新动态

火山引擎边缘云:数智化项目管理助力下的业务增长引擎

火山引擎边缘云

数字化 飞书 数智化 #项目管理

企业内部通讯,WorkPlus助您打造高效沟通平台

BeeWorks

Github上线即遭狂转!上百人通过这份算法手抄本成功上岸字节

程序员万金游

#java java 架构 #算法 #数据结构 #java编程

Redis类型(Type)与编码(Encoding)

Java随想录

redis

关于 TDengine 3.0 数据订阅,你需要知道这些

TDengine

tdengine 时序数据库 国产时序数据库

如何在低代码平台中应用可视化编程

力软低代码开发平台

华为3场重磅主题演讲先睹为快,顶级云原生&开源盛会即刻出发

华为云开源

华为 开源 云原生 KubeCON

使用Optional优雅避免空指针异常

Java随想录

Java 异常

活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术

墨天轮

MySQL 数据库 oracle postgresql zabbix

WorkPlus Meet 视频会议,自主可控,支持私有化部署

BeeWorks

五分钟了解 Node.js Shebang_语言 & 开发_Alex Ewerlöf_InfoQ精选文章