#!/usr/bin/env node
在一些示例的开头,我已经看到了这一行,nodejs
而我在Google上搜索时没有找到任何可以回答该行原因的主题。
单词的性质使搜索变得不那么容易。
我读了一些javascript
和nodejs
书籍最近,我不记得看到它在任何人。
如果您想要一个示例,则可以查看RabbitMQ
官方教程,他们几乎在所有示例中都有它,这里是其中之一:
#!/usr/bin/env node
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(err, conn) {
conn.createChannel(function(err, ch) {
var ex = 'logs';
var msg = process.argv.slice(2).join(' ') || 'Hello World!';
ch.assertExchange(ex, 'fanout', {durable: false});
ch.publish(ex, '', new Buffer(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function() { conn.close(); process.exit(0) }, 500);
});
有人可以解释一下这行是什么意思吗?
如果放置或删除此行有什么区别?在什么情况下需要?
#!/usr/bin/env node
是
shebang行的
一个实例 : 在 类Unix平台
上的可执行纯文本文件中的第一行,它告诉系统哪个解释器通过_魔术#!
前缀(称为 _shebang
)后的命令行 将该文件传递给执行该文件。 。
注: 的Windows 并 没有 支持家当线,所以他们有效地 忽略了 那里。在Windows上,它只是给定文件的 文件扩展名
,它确定哪种可执行文件将对其进行解释。 但是,您仍然需要在中使用它们npm
。[1]
下面 对shebang行的一般讨论 仅限于类Unix平台:
在下面的讨论中,我将假定包含要由Node.js执行的源代码的文件简称为file
。
您 需要此行 ,如果你要调用一个Node.js的源文件, 直接 ,因为它本身就是一个可执行文件-这是假定该文件已被标记为可执行的命令,例如chmod +x ./file
,然后可以让您调用文件例如,带有,./file
或者,如果它位于$PATH
变量中列出的目录之一中,则简称为file
。
npm
"bin"``package.json
node
解释器显式调用文件,例如,node ./file
可选背景信息 :
#!/usr/bin/env <executableName>
是一种 可移植地
指定解释器的方法:简而言之,它说:<executableName>
在$PATH
变量中列出的目录中的任何位置(首先)找到它(然后将其隐式传递到手边的文件)都执行。
这说明了给定的解释器可能安装在跨平台的不同位置的事实node
,对于Node.js二进制文件绝对是这种情况。
相比之下,env
实用程序本身的位置可以依赖于跨平台的 相同 位置,即/usr/bin/env
-并且在shebang行中 需要
指定可执行文件的 完整 路径。 __
需要注意的是POSIX工具env
被 重新利用 这里的文件名来查找,并在执行可执行文件$PATH
。
的真正目的env
是管理命令的环境-
请参阅env
POSIX规范
还值得注意的是,Node.js正在对shebang行进行语法 例外
,因为它们不是有效的JavaScript代码(#
与POSIX之类的shell和其他解释器不同,它不是JavaScript中的注释字符)。
[1]为了跨平台的一致性,在安装包文件中指定的可执行文件时(通过属性), 在Windows上 npm
创建 包装器
*.cmd
文件(批处理文件)。本质上,这些包装批处理文件 模仿 Unix shebang功能:它们
使用shebang行中指定的可执行文件显式调用目标文件 -因此, 即使您只打算在Windows上运行它们 ,
您的脚本也必须包含shebang行
由于可以在不使用文件的情况下调用文件package.json``"bin"
__ ****
*.cmd``.cmd
扩展名,这提供了无缝的跨平台体验:在Windows和Unix上,您都可以npm
使用其原始的无扩展名有效地调用安装的CLI。
问题内容: 我已经使用以下命令安装了nodejs: 然后我使用以下方法安装了npm: 然后我已经永久安装了: 现在我去我的项目 并尝试运行 然后我得到以下消息: 谁能告诉我怎么回事? 问题答案: 编辑:自2018年12月起,这不再是正确的方法。请参阅其他两个答案。 您需要将nodejs可执行文件符号链接到node上,原因是当您执行“ apt-get install node”时,它会安装一个不相关
问题内容: 我通过apt-get install和所有依赖项安装了节点js和npm,然后安装了browserify 它经历了整个过程,似乎安装正确,但是当我尝试按照此演练做一个简单的捆绑包时 我得到错误: / usr / bin / env:节点:没有这样的文件或目录 问题答案: 您还可以使用 NVM 或 Nodejs版本管理器 安装Nodejs 。使用版本管理器有很多好处。其中之一就是您不必担心
问题内容: 我正在尝试将nodeJs安装到我的Ubuntu 14.04中,以便使用GruntJs。 我已经阅读了有关Ubuntu的不同执行方式(问题?)的信息,因此,为了安装它,我做了以下操作: 在输入咕gr声之后,我得到了错误: 因此,我尝试了: 再试一次,仍然出现错误,我试过了: 我收到此消息: 我确实尝试进行清理,以防万一: 但是没有,错误仍然存在:当我键入grunt时,我仍然得到 我该
我在许多地方看到过,包括本网站上的建议(首选的Bash shebang是什么?),使用而不是。我甚至看到一个有进取心的人建议使用是错误的,这样做会丢失bash功能。 尽管如此,我在一个严格控制的测试环境中使用bash,在这个环境中,循环中的每个驱动器本质上都是单个主驱动器的克隆。我理解可移植性的论点,尽管它不一定适用于我的情况。是否还有其他理由选择而不是替代方案?假设考虑可移植性,是否有理由使用它
问题内容: 在Bash脚本的标头中,这两个语句之间有什么区别: 当查阅 手册页时,得到以下定义: 这是什么意思? 问题答案: 运行命令,通过具有寻找不管程序的默认版本是在当前的利益 ENV ironment。 这样,您不必在系统上的特定位置查找它,因为这些路径可能在不同系统上的不同位置。只要它在您的路径中,它就会找到它。 缺点是,如果您希望支持Linux,则将无法传递多个参数(例如,您将无法编写)
问题内容: 我想打印根节点的子元素。这是我的XML文件。 根据我的理解,根节点是“公司”,其子节点必须是“职员”和“职员”(因为存在“职员”节点2次)。但是,当我尝试通过我的Java代码获取它们时,我得到了5个子节点。3个额外的文本节点从哪里来? Java代码: 输出: 为什么三个文本节点要过来? 问题答案: 为什么三个文本节点要过来? 它们是子 元素 之间的空白。如果只需要子元素,则应忽略其他类