Node.js脚本的适当hashbang

Node.js脚本的适当hashbang,node.js,shell,shebang,Node.js,Shell,Shebang,我正在尝试为node.js创建一个脚本,该脚本将在多个环境中工作。特别是对我来说,我在OSX和Ubuntu之间来回切换。在前者中,节点安装为Node,但在后者中,节点安装为nodejs。在我的脚本顶部,我可以: #!/usr/bin/env node 或 只要安装了node,我宁愿让脚本作为一个可执行文件在任何一个环境中运行,而不是让一个或另一个环境指定命令(/script name.jsvs.node script name.js) 是否有任何方法可以为node.js指定备份hashbang

我正在尝试为node.js创建一个脚本,该脚本将在多个环境中工作。特别是对我来说,我在OSX和Ubuntu之间来回切换。在前者中,节点安装为
Node
,但在后者中,节点安装为
nodejs
。在我的脚本顶部,我可以:

#!/usr/bin/env node

只要安装了node,我宁愿让脚本作为一个可执行文件在任何一个环境中运行,而不是让一个或另一个环境指定命令(
/script name.js
vs.
node script name.js


是否有任何方法可以为node.js指定备份hashbang或在这两种情况下都兼容的备份hashbang?

如果您的脚本是供节点开发人员使用的,您完全应该使用

#!/usr/bin/env node
而且不必费心尝试与只安装了Node作为
nodejs
的用户兼容

理由:

  • 这是酷孩子们正在做的事情,如果你不这么做,你就不酷。主要节点项目,如、甚至只需使用
    #/usr/bin/env节点
    作为其可执行脚本的shebang
  • 因为酷酷的孩子们正在这么做,任何在Ubuntu上使用Node的人都会设置一个
    /usr/bin/Node
    作为指向
    nodejs
    的符号链接。在堆栈溢出和整个web上都有这样做的方法。甚至还有
    nodejs legacy
    包,其全部目的是为您创建此符号链接。使用Node的人知道如何在Ubuntu上解决这个问题,如果他们想使用Node中编写的几乎所有软件,他们必须这样做
  • 在Ubuntu 14.04上,这个问题似乎已经不存在了;我刚刚清除了Node并运行了一个
    apt get install nodejs
    ,它创建了
    /usr/bin/Node
    作为
    /etc/alternations/Node
    的符号链接。我怀疑,受这一问题困扰的人是日益缩小的少数群体
即使您针对的是不懂节点的人,您也可能希望使用
#/usr/bin/env node
,如果您认为有必要,可以在安装文档中添加手动符号链接创建或安装
nodejs legacy
包的可能需要。请注意,如果具有
nodejs
但不具有
node
的用户尝试使用上述shebang运行您的程序,他们将看到:

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

并将在第一个结果中以及在第一页上多次为他们提供修复

如果您确实非常希望确保用户可以在
nodejs
可用但
node
不可用(或者
node
实际上是可用的)的系统上运行您的软件,那么您可以使用以下“两行shebang”:


但是,当节点世界中几乎没有其他人这样做时,您真的需要这样做吗?

您可以制作一个包装器外壳脚本来调用您的脚本,尝试找出节点所在的位置以及它的名称。Unix站点上的这个答案中有很多建议-我有一个从
#更改而来的nodejs脚本/usr/bin/node
#/usr/bin/nodejs
当我从Ubuntu 12.04升级到12.10时。它是从检查两者的包装器调用的。用于讨论
#/usr/bin/env
hack,请参阅和。第3阶段中有一个名为“Hashbang语法”的TC39提案,其目的是规范使用的Hashbang:如果首选对
nodejs
可执行文件的支持,您可能会发现将shebang与
一起使用会稍微漂亮一点/bin/sh
//bin/false | | exec“$(command-v nodejs | | command-v node)”“$0”
。请注意,例如
--实验模块
,如果使用此
env
shebang行。周围有黑客,但他们都是。
#!/usr/bin/env node
#!/bin/sh
':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@"

console.log('Hello world!');