适用于 Node.js 脚本的 hashbang

2023-12-26

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

#!/usr/bin/env node

or

#!/usr/bin/env nodejs

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

有什么方法可以指定备份 hashbang 或在任一情况下与 Node.js 兼容的 hashbang 吗?


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

#!/usr/bin/env node

并且不必费心尝试与仅安装 Node 的人兼容nodejs.

理由:

  • 这是很酷的孩子们都会做的事,如果你不这样做,那你就不酷。主要节点项目如jshint https://github.com/jshint/jshint/blob/master/bin/jshint, karma https://github.com/karma-runner/karma/blob/master/bin/karma, bower https://github.com/bower/bower/blob/master/bin/bower, 乃至npm https://github.com/npm/npm/blob/master/bin/npm-cli.js只需使用#!/usr/bin/env node作为其可执行脚本的 shebang。
  • 因为酷孩子们都在这样做,所以任何在 Ubuntu 上使用 Node 的人都建立了一个/usr/bin/node作为符号链接nodejs。有备受关注的说明 https://stackoverflow.com/questions/18130164/nodejs-vs-node-on-ubuntu-12-04在 Stack Overflow 上以及整个网络上执行此操作。甚至还有nodejs-legacy包的全部目的是为您创建此符号链接。使用 Node 的人知道如何在 Ubuntu 上解决这个问题,并且他们have to如果他们想使用几乎任何用 Node 编写的软件。
  • 在 Ubuntu 14.04 上这个问题似乎不再存在;我刚刚清除了 Node 并运行了apt-get install nodejs它创造了/usr/bin/node作为符号链接/etc/alternatives/node。我怀疑,受这个问题困扰的人只是少数。

即使您的目标人群是不懂 Node 的人,您可能仍然想使用#!/usr/bin/env node,也许添加了手动符号链接创建或安装的可能需要nodejs-legacy如果您认为有必要,请将其打包到您的安装文档中。请注意,如果有人nodejs但不是nodeavailable 尝试使用上面的 shebang 运行您的程序,他们会看到:

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

and 谷歌搜索那个 https://www.google.co.uk/search?q=%22%2Fusr%2Fbin%2Fenv%3A%20node%3A%20No%20such%20file%20or%20directory%22将在第一个结果中为他们提供修复,并在第一页上多次修复。

如果您确实迫切希望确保用户可以在以下系统上运行您的软件:nodejs可用但是node不是(或在哪里node实际上是业余分组无线电节点计划 http://packages.ubuntu.com/lucid/node),那么你可以使用这个“两行shebang”取自Unix 和 Linux 堆栈交换 https://unix.stackexchange.com/a/65295/29001:

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

console.log('Hello world!');

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于 Node.js 脚本的 hashbang 的相关文章

随机推荐

  • 在 Flutter 中将 Widget 放在 ListView 之上

    下面的代码对我来说可以很好地调用和显示来自 firestore 的数据 return ListView padding const EdgeInsets only top 20 0 children snapshot map data gt
  • 任务异步控制器方法未命中

    因此 我们有一个 MVC 项目 该项目已通过 MVC 1 到 4 的不同版本进行了升级 现在我们有一个控制器方法 public async Task
  • 在 Spark 数据框中进行数据透视时,“GroupedData”对象没有属性“show”

    我想旋转 Spark 数据框 我指的是pyspark 文档 https spark apache org docs 1 6 0 api python pyspark sql html pyspark sql DataFrame 并基于piv
  • “Hobby”Heroku 计划允许多少个应用程序?

    免费 层 Heroku 帐户最多允许使用 5 个应用程序 爱好 计划允许使用多少个应用程序 我看过 Heroku一般定价页面 https www heroku com pricing 详细定价页面 https www heroku com
  • 由于多个抽象基类,实现两个具有相同名称但不同的非协变返回类型的函数

    如果我有两个抽象类定义一个具有相同名称但不同的非协变返回类型的纯虚函数 我如何从它们派生并定义它们的函数的实现 include
  • 在 Django 中提供静态 HTML

    我对 Django 还很陌生 所以请原谅我 如果这是我不应该考虑的事情 但我希望我的应用程序能够链接到大量静态 HTML 页面 足以为每个页面创建 URL 路径 是不合理的 并且会不断有更多的内容被上传 由我通过 FTP 我通过将这些 HT
  • 私有静态最终字段

    我只是想澄清这一点 有什么区别 private static int STUDENT AGE 18 and private static final int STUDENT AGE 18 领域内 乔恩 斯基特 Jon Skeet 解释为 与
  • 具有文件系统依赖性的单元测试代码

    我正在编写一个组件 给定一个 ZIP 文件 该组件需要 解压缩文件 在解压后的文件中找到特定的dll 通过反射加载该 dll 并调用其上的方法 我想对这个组件进行单元测试 我很想编写直接处理文件系统的代码 void DoIt Zip Unz
  • 如何使用 Java 获取 XML id 值?

    对于 XML 关键字搜索项目 用户可以搜索 XML 代码中的任意值
  • 添加新数据源对话框期间新连接失败

    问题 如果我安装了 Visual Studio 2010 Service Pack 1 并且转到 数据 添加新数据源 并单击 数据库 则会显示标准的 选择数据连接 向导页面 在该页面上 如果我配置了现有连接 则可以选择它 并将该数据源添加到
  • iOS VIPER架构,谁必须实例化整个模块?

    考虑到VIPER结构 我有两个模块 A 和 B 第一个模块 A 通过演示器想要执行必须在模块 B 中完成的操作 因此告诉其线框执行该操作 问题是 谁负责实例化整个模块 视图 交互器 演示器 我看到了一些采用不同方法的例子 在应用程序的开头创
  • boto3 lambda 调用运行 ECS 任务需要在修订号中进行硬编码吗?

    长话短说 我不想将任务的 ECS 任务定义修订号硬编码到我的 lambda 源代码中 每次我更新任务定义时 本质上都是更新我的源代码 在ECS 的 boto3 文档run task https boto3 amazonaws com v1
  • 如何重命名 Dask Dataframe 的索引

    我将如何重命名 dask 数据帧上的索引 我尝试过像这样 df index name foo 但重新检查 df index name 显示它仍然是以前的样子 这似乎不是一种有效的方法 所以如果有更直接的方法我不会感到惊讶 d index n
  • 在 AWS 中使用 Python 中的 Lambda 将文件写入 S3

    在 AWS 中 我尝试使用 Lambda 函数将文件保存到 Python 中的 S3 虽然这可以在我的本地计算机上运行 但我无法让它在 Lambda 中运行 我一整天都在研究这个问题 非常感谢您的帮助 谢谢 def pdfToTable P
  • 如何在 PHP 中重新索引数组但索引从 1 开始?

    我有以下数组 我想对其重新索引 以便反转键 最好从 1 开始 当前数组 edit 该数组实际上看起来像这样 Array 2 gt Object title gt Section linked gt 1 1 gt Object title g
  • Airflow - Python 文件不在同一个 DAG 文件夹中

    我正在尝试使用 Airflow 来执行一个简单的 python 任务 from future import print function from airflow operators python operator import Pytho
  • 如何解决 C# 应用程序中的 FTP 超时问题

    我正在使用以下 C 代码从远程服务提供商通过 FTP 传输约 40MB 的 CSV 文件 大约 50 的情况下 下载会挂起并最终超时 在我的应用程序日志中 我得到如下一行 gt Unable to read data from the tr
  • 更改 editText 提示的字体

    是否可以更改显示在提示中的字体EditText场地 我想在 xml 本身中设置字体 您可以使用 SpannableString 和自定义 TypefaceSpan 来更改它 首先 创建一个 Custom TypefaceSpan 类 pub
  • 避免图像 CSS 拉伸

    我正在将图像渲染成div 我想避免我的形象被拉伸 div height 300px width 300px img min width 300px min height 300px max height 300px 我的问题是我的图像的宽度
  • 适用于 Node.js 脚本的 hashbang

    我正在尝试为 node js 创建一个可以在多种环境中运行的脚本 特别是对我来说 我经常在 OS X 和 Ubuntu 之间来回切换 在前者中 Node 安装为node 但在后者中是nodejs 在我的脚本的顶部 我可以有 usr bin