您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

节点文件开头的“ / usr / bin / env节点”到底做了什么?

节点文件开头的“ / usr / bin / env节点”到底做了什么?

#!/usr/bin/env node是 : 在 上的可执行纯文本文件中的第一行,它告诉系统哪个解释器通过_魔术#!前缀(称为 _shebang )后的命令行 将该文件传递给执行该文件

注: ,所以他们有效地 忽略了 那里。在Windows上,它只是给定文件文件扩展名 ,它确定哪种可执行文件将对其进行解释。 。[1]

下面 仅限于类Unix平台:

在下面的讨论中,我将假定包含要由Node.js执行的源代码文件简称为file

您 ,如果你要调用一个Node.js的源文件直接 ,因为它本身就是一个可执行文件-这是假定该文件已被标记为可执行的命令,例如chmod +x ./file,然后可以让您调用文件例如,带有,./file或者,如果它位于$PATH变量中列出的目录之一中,则简称为file

#!/usr/bin/env <executableName>是一种 可移植地 指定解释器的方法:简而言之,它说:<executableName>$PATH变量中列出的目录中的任何位置(首先)找到它(然后将其隐式传递到手边的文件)都执行。

这说明了给定的解释器可能安装在跨平台的不同位置的事实node,对于Node.js二进制文件绝对是这种情况。

相比之下,env实用程序本身的位置可以依赖于跨平台的 相同 位置,即/usr/bin/env-并且在shebang行中 需要 指定可执行文件完整 路径。 __

需要注意的是POSIX工具env重新利用 这里的文件名来查找,并在执行可执行文件$PATH。 的真正目的env是管理命令的环境- 请参阅envPOSIX规范

还值得注意的是,Node.js正在对shebang行进行语法 例外 ,因为它们不是有效的JavaScript代码#与POSIX之类的shell和其他解释器不同,它不是JavaScript中的注释字符)。

[1]为了跨平台的一致性,在安装包文件中指定的可执行文件时(通过属性), )。本质上,这些包装批处理文件 模仿 Unix shebang功能:它们 -因此, ,

由于可以在不使用文件的情况下调用文件package.json``"bin" __ ****

*.cmd``.cmd扩展名,这提供了无缝的跨平台体验:在Windows和Unix上,您都可以npm使用其原始的无扩展名有效地调用安装的CLI。

其他 2022/1/1 18:14:37 有593人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶