Node.js脚本的适当hashbang

Exp*_*lls 68 shell shebang node.js

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

#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

要么

#!/usr/bin/env nodejs
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ery 102

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

#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

而不是试图与只安装了Node的人兼容nodejs.

理由:

  • 这是酷孩子们正在做的事情,如果你不这样做,你也不酷.像jshint,karma,bower甚至npm这样的主要节点项目只是#!/usr/bin/env node用作可执行脚本的shebang.
  • 因为很酷的孩子正在这样做,所以在Ubuntu上使用Node的人都设置了/usr/bin/node一个符号链接nodejs.在Stack Overflow上以及整个网络上都有高度重视的说明.甚至有一个nodejs-legacy包,其目的是为你创建这个符号链接.使用Node的人知道如何在Ubuntu上解决这个问题,如果他们想要使用几乎任何在Node中编写的软件,他们必须这样做.
  • 这个问题在Ubuntu 14.04上似乎不再存在; 我只是清除了Node并运行了一个apt-get install nodejs并创建/usr/bin/node了一个符号链接/etc/alternatives/node.我怀疑,受这个问题困扰的人是一个萎缩的少数民族.

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

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

谷歌搜索将在第一页结果和第一页上多次给他们修复.

如果你真的,拼命想要确保用户可以在nodejs可用但node不是(或node实际上是业余分组无线节点程序)的系统上运行你的软件,那么你可以使用这个"双线shebang"来自Unix和Linux Stack Exchange:

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

console.log('Hello world!');
Run Code Online (Sandbox Code Playgroud)

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

  • 如果首选支持`nodejs` 可执行文件,您可能会发现使用带有`#!/bin/sh` 和`//bin/false || 的shebang 稍微漂亮一点 exec "$(command -v nodejs || command -v node)" "$0"`。 (2认同)
  • 请注意,[你不能在 Linux 上将参数传递给节点](/sf/ask/301218991/),例如`--experimental-modules`,如果你使用这个`env` shebang 行。周围有黑客,但它们[丑陋](http://sambal.org/2014/02/passing-options-node-shebang-line/)。 (2认同)