Node.js脚本的适当hashbang
我正在尝试为node.js创建一个脚本,该脚本将在多个环境中工作。特别是对我来说,我在OSX和Ubuntu之间来回切换。在前者中,节点安装为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
,但在后者中,节点安装为nodejs
。在我的脚本顶部,我可以:
#!/usr/bin/env node
或
只要安装了node,我宁愿让脚本作为一个可执行文件在任何一个环境中运行,而不是让一个或另一个环境指定命令(/script name.js
vs.node script name.js
)
是否有任何方法可以为node.js指定备份hashbang或在这两种情况下都兼容的备份hashbang?如果您的脚本是供节点开发人员使用的,您完全应该使用
#!/usr/bin/env node
而且不必费心尝试与只安装了Node作为nodejs
的用户兼容
理由:
- 这是酷孩子们正在做的事情,如果你不这么做,你就不酷。主要节点项目,如、甚至只需使用
作为其可执行脚本的shebang#/usr/bin/env节点
- 因为酷酷的孩子们正在这么做,任何在Ubuntu上使用Node的人都会设置一个
作为指向/usr/bin/Node
的符号链接。在堆栈溢出和整个web上都有这样做的方法。甚至还有nodejs
包,其全部目的是为您创建此符号链接。使用Node的人知道如何在Ubuntu上解决这个问题,如果他们想使用Node中编写的几乎所有软件,他们必须这样做nodejs legacy
- 在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!');