#!/usr/bin/env node
是shebang line的一个实例:用在Unix-like的平台上的可执行纯文本文件中的第一行,它通过#!
前缀(称为shebang)命令行告诉系统哪个解释器将该文件传递给执行程序。
Windows不支持shebang lines,因此实际上它们被忽略。 在Windows上,它只是给定文件的文件扩展名,它确定哪种可执行文件将对其进行解释。 但是,您仍然需要在npm上下文中使用它们。[1]
下面是仅限于类Unix平台对shebang line的一般讨论:
在下面的讨论中,我将假定包含要由Node.js执行的源代码的文件简称为file
。
- 如果要直接调用Node.js源文件作为可执行文件,则需要此行,它本身就是可执行文件-假定已使用
chmod + x ./file
等命令将该文件标记为可执行文件,然后允许您使用例如./file
调用文件,或者如果它位于$PATH
变量中列出的目录之一中,则以file
的形式调用。- 具体来说,您需要一个shebang line,以作为npm软件包的一部分基于Node.js源文件创建CLI,并且要由npm根据package中 package.json文件中“bin”键的值来安装CLI。
- 通过node解释器显式调用文件,则不需要此行,例如
node ./file
[1]为了跨平台一致性,npm在安装程序包的package.json
文件中指定的可执行文件时(通过"bin"
属性)在Windows上创建包装器*.cmd
文件(批处理文件)。 本质上,这些包装批处理文件模仿Unix shebang功能:它们使用shebang line中指定的可执行文件显式调用目标文件-因此,即使您只打算在Windows上运行它们,您的脚本也必须包含shebang行。
由于*.cmd文件可以在不带.cmd扩展名的情况下调用,因此可以提供无缝的跨平台体验:在Windows和Unix上,您都可以使用其原始的无扩展名有效地调用npm安装的CLI。
What exactly does “/usr/bin/env node” do at the beginning of node files?