适用于Node.js脚本的hashbang


94

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

#!/usr/bin/env node

要么

#!/usr/bin/env nodejs

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

是否有任何方法可以指定备份hashbang或与node.js兼容的备份哈希?


您可以制作一个包装Shell脚本来调用您的脚本,该脚本试图找出节点的位置及其名称。
2013年

4
的许多建议在这个答案在UNIX网站- unix.stackexchange.com/questions/65235/...
萨金特

我有一个剧本的NodeJS,我从改变#!/usr/bin/node#!/usr/bin/nodejs时我升级从Ubuntu的12.04至12.10。然后从检查两者的包装器中调用它。有关#!/usr/bin/envhack的讨论,请参阅此问题我的答案
基思·汤普森

第3阶段中有TC39提案,名为“哈希邦语法”,旨在对二手哈希邦进行标准化:github.com/tc39/proposal-hashbang
M. Twarog

Answers:


150

如果您的脚本供Node开发人员使用,则绝对应该使用

#!/usr/bin/env node

不必试图与只安装Node的用户兼容nodejs

理由:

  • 这就是很酷的孩子们正在做的事情,如果您也不这样做,那么您就不会很酷。主要节点项目,如jshint因果报应凉亭,甚至NPM简单地使用#!/usr/bin/env node作为家当他们可执行的脚本。
  • 因为很酷的孩子正在这样做,所以在Ubuntu上使用Node的任何人都将设置/usr/bin/node为的符号链接nodejs。有高度看说明书上堆栈溢出这里这样做,并在网上所有。甚至有一个nodejs-legacy软件包的全部目的是为您创建此符号链接。使用Node的人知道如何在Ubuntu上解决此问题,如果他们想使用几乎用Node编写的任何软件,就必须这样做
  • 这个问题似乎在Ubuntu 14.04上似乎不再存在。我只是清除Node并运行一个,apt-get install nodejs并将其创建/usr/bin/node为的符号链接/etc/alternatives/node。我怀疑受此问题困扰的人正在减少。

即使您是针对不懂Node的人的,也可能仍要使用#!/usr/bin/env nodenodejs-legacy如果您认为有必要,可能会在安装文档中添加手动创建符号链接或安装软件包的可能。请注意,如果有nodejs但没有空的人node尝试使用上述shebang运行您的程序,他们将看到:

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

谷歌搜索,这将在第一结果和很多时候在第一页上为他们提供修复。

如果您真正地急切地希望确保用户可以在nodejs可用但node不可用的系统(或node实际上是“业余分组无线节点”程序的系统)上运行您的软件,那么您可以使用此“两行shebang”来自Unix和Linux Stack Exchange

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

console.log('Hello world!');

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


2
如果nodejs首选对可执行文件的支持,您可能会发现它与#!/bin/sh和配合使用会更漂亮//bin/false || exec "$(command -v nodejs || command -v node)" "$0"
lennartcl

2
请注意,如果使用此shebang行,则不能将参数传递给Linux上的node,例如。周围有很多骇客,但是它们很丑陋--experimental-modulesenv
Dan Dascalescu,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.