适用于node.js脚本的hashbang

我正在尝试为node.js创build一个可以在多个环境中工作的脚本。 特别是对于我来说,我在OS X和Ubuntu之间来回切换。 在前者中,节点被安装为node ,而后者则是nodejs 。 在我的脚本的顶部,我可以有:

 #!/usr/bin/env node 

要么

 #!/usr/bin/env nodejs 

我宁愿让这个脚本作为任一环境的可执行文件运行,只要安装了这个节点,而不是让其中一个或另一个必须指定命令( ./script-name.jsnode script-name.js )。

有没有办法指定一个备份hashbang或在node.js兼容的情况?

如果您的脚本是供Node开发人员使用的,那么您绝对应该使用它

 #!/usr/bin/env node 

并且不打算与仅安装了nodejs Node的人兼容。

理由:

  • 这是很酷的孩子正在做什么,如果你不这样做,你不是很酷。 像jshint , karma , bower ,甚至npm这样的主要节点项目只是使用#!/usr/bin/env node作为可执行脚本的文件。
  • 因为很酷的孩子正在这样做,所以任何在Ubuntu上使用Node的人都会将/usr/bin/nodenodejs的符号链接。 有堆栈溢出,并在networking上的所有这些高度查看说明 。 甚至还有一个nodejs-legacy包,其目的是为你创build这个符号链接。 使用Node的人知道如何在Ubuntu上解决这个问题,他们必须要使用几乎所有在Node中编写的软件。
  • 这个问题在Ubuntu 14.04上似乎还不存在。 我只是清除节点,并运行apt-get install nodejs ,并创build了/usr/bin/node作为/etc/alternatives/node的符号链接。 受这个问题困扰的人,我怀疑是less数人。

即使你的目标是针对无节制的人,你仍然可能想要使用#!/usr/bin/env node ,如果你愿意的话,可能需要手动创build符号链接或者安装nodejs-legacy包到你的安装文档认为有必要。 请注意,如果有人使用nodejs而不是可用node尝试用上面的shebang运行你的程序,他们会看到:

/ usr / bin / env:node:没有这样的文件或目录

和谷歌search,将给他们的第一个结果,并在第一页多次修复。

如果真的要拼命地确保用户可以在nodejs可用但node不可用(或node实际上是业余无线电节点程序 )的系统上运行软件,那么可以使用这个“two-line shebang“取自Unix&Linux Stack Exchange :

 #!/bin/sh ':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@" console.log('Hello world!'); 

但是当Node几乎没有其他人在使用时,你真的需要这么做么?