2024 可信数据库发展大会报名通道已开启!!
写点什么

五分钟了解 node.js shebang-金马国际

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

    阅读完需:约 7 分钟

五分钟了解 node.js shebang

重磅上线,10 周带你进行工具、对话及多模态等不同类型 agents 工程化开发实战!

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



是一种解释性语言,需要将其源代码提供给某些解释器才能运行。如果要使用运行 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,但是该功能已移除,现在我们只能,它可能位于脚本旁边也可能不在,取决于 engine-strictconfig 配置标志的设置。


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


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


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


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

使用 typescript 运行它

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


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


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


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


原文链接:


2020-09-11 09:574844

评论

发布
暂无评论
  • deno 真能成功反超、压过目前最具人气的 node.js 吗?

  • 为了方便新同学学习 react native,更快地搭建好环境,这节课会从头到尾带你搭建一套新环境。

    2023-03-01

  • 搭建 android 环境比搭建 ios 环境遇到的网络问题更少,更推荐新手直接搭建 android 环境。

    2023-02-01

  • 这节课,我们来看看不同语言分别是怎么构建镜像的。

    2023-01-06

  • 深入了解过deno的各项优点之后,我意识到了deno正是2020年的今天,后端javascript开发人员所需要的东西。

  • 前段时间接手了一个比较老的 vue 项目,nodejs 版本是 v12.13,因为我电脑的nodejs版本是16.x,没有办法运行这个项目,为了减少维护多个 node 版本带来的麻烦,我安装了nvm。

    2022-03-24

  • 这节课让我们把爬虫项目相关的微服务部署到 kubernetes 中。

    2023-02-11

  • node.js 的出现使得前端工程师可以跨端工作在服务器上,当然,一个新的运行环境的诞生亦会带来新的模块、功能、抑或是思想上的革新,本文将带领读者领略 node.js (以下简称 node) 的模块设计思想以及剖析部分核心源码实现。

  • 高版本虚拟机,可以解释运行低版本字节码文件

    2022-05-11

  • neon是一个可以使用rust开发原生node模块的库和工具链,类似于使用c和c 所实现的功能,它还利用了rust安全方面的好处。

  • 恶意脚本默默地在后台运行。

  • 这节课我们来深入了解一下python中的常见爬虫框架:scrapy框架。我们将学习什么是scrapy框架、它的特点是什么以及如何安装和使用它。

    2023-04-24

  • 这节课,我们重点来看看企业级项目是怎么做编译配置的。

    2022-11-23

  • bun 的高速原生 bundler 目前正处于 beta 阶段。大家已经可以通过 bun build cli 命令或者新的 bun.build() javascript api 抢先体验。

  • 本篇为系列文章第四篇,将介绍使用 chaosblade operator 对 kubernetes node 进行混沌工程实验,实验包括:node cpu 负载场景、node 网络延迟场景、node 网络丢包场景、node 域名访问异常场景、node 磁盘填充场景、node 杀指定进程和node 挂起指定进程等。

    2020-07-23

  • 安装nvm 之前 需要把之前安装的node 版本卸载,

    2023-04-21

  • node.js调试介绍,涵盖了调试的基本概念和工具。

  • 原文地址:https://www.ijcai.org/proceedings/2022/0272.pdf

    2022-12-29

  • 这周在刷链表的算法时,发现对于这类问题用图解的方式来解决十分简单。通常我们的草图画完了,代码也就随之写出来了,不用绞尽脑汁去想 p.next = new node(); p = p.next 这么绕的代码。

    2023-03-21

  • 近期小林迷恋上了node这位小美女,倾慕之情溢于言表,为了打动她的芳心,决定接受直击灵魂深处的十大拷问,拷问内容分为两期,这是第一期,下周更新第二期。

    2020-08-30

发现更多内容
金马国际
网站地图