Node.jsスクリプトに適切なハッシュバン


95

複数の環境で機能するnode.jsのスクリプトを作成しようとしています。特に私にとっては、OSXとUbuntuを切り替えています。前者の場合、Nodeはとしてインストールされますnodeが、後者の場合はnodejsです。スクリプトの上部に、次のものを含めることができます。

#!/usr/bin/env node

または

#!/usr/bin/env nodejs

どちらか一方がコマンドを指定するのではなく、ノードがインストールされている限り、どちらの環境でもスクリプトを実行可能ファイルとして実行したいと思います(./script-name.jsvs. node script-name.js)。

バックアップハッシュバンまたはnode.jsのいずれかの場合に互換性のあるハッシュバンを指定する方法はありますか?


スクリプトを呼び出すラッパーシェルスクリプトを作成して、ノードが存在する場所とその名前を見つけようとすることができます。
ドゥーン

4
- Unixのサイトでこの答えで提案の多くunix.stackexchange.com/questions/65235/...
sargant

Ubuntu12.04から12.10にアップグレード#!/usr/bin/nodeした#!/usr/bin/nodejsときに変更したnodejsスクリプトがあります。そして、両方をチェックするラッパーから呼び出されます。#!/usr/bin/envハックの説明については、この質問私の回答を参照してください。
キーストンプソン

ステージ3には、使用済みのハッシュバンを標準化することを目的とした「ハッシュバン文法」と呼ばれるTC39の提案があります。github.com/ tc39 / proposal
M.Twarog19年

回答:


151

スクリプトがノード開発者による使用を目的としている場合は、絶対に使用する必要があります

#!/usr/bin/env node

Nodeをとしてインストールしているだけの人との互換性を気にしないでくださいnodejs

理論的根拠:

  • それはクールな子供たちがしていることです、そしてあなたもそれをしなければ、あなたはクールではありません。主なノードのようなプロジェクトjshintカルマバウアーでも、およびNPMは、単に使用し#!/usr/bin/env node、実行可能スクリプトのシェバングとして。
  • かっこいい子供たちがやっているので、UbuntuでNodeを使用する人は誰でも/usr/bin/node、へのシンボリックリンクとしてを設定していnodejsます。Stack Overflowやウェブ全体で、これを行うための非常によく見られる手順があります。nodejs-legacyこのシンボリックリンクを作成することを目的としたパッケージもありました。Nodeを使用する人々は、Ubuntuでこの問題を修正する方法を知っており、Nodeで作成されたほとんどすべてのソフトウェアを使用したい場合は修正する必要があります。
  • この問題は、Ubuntu14.04にはもう存在しないようです。Nodeを削除して実行するapt-get install nodejs/usr/bin/node、へのシンボリックリンクとして作成されました/etc/alternatives/node。この問題に苦しんでいる人々は、私が思うに、縮小している少数派です。

ノードの#!/usr/bin/env node知識がない人をターゲットにしている場合でも、必要に応じて、手動でシンボリックリンクを作成したり、nodejs-legacyパッケージをインストールドキュメントにインストールしたりする必要がある可能性を追加して、使用することをお勧めします。利用できnodejsないがnode利用できない誰かが上記のシバンでプログラムを実行しようとすると、次のように表示されることに注意してください。

/ usr / bin / env:ノード:そのようなファイルまたはディレクトリはありません

そしてグーグルは彼らに最初の結果と最初のページで何度も修正を与えるでしょう。

本当に、ユーザーnodejsが利用可能であるが利用できnodeないシステム(またはnode実際にはアマチュアパケット無線ノードプログラムがあるシステム)でソフトウェアを実行できることを必死に確認したい場合は、この「2行のシバン」を使用できます。以下からのUnixとLinuxスタック交換

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

console.log('Hello world!');

しかし、ノードの世界で他にほとんど誰もいないときに、本当にこれを行う必要がありますか?


2
サポート場合はnodejs、実行可能であることが好ましい、あなたはそれが少しきれいにシェバングを使用するために見つけるかもしれない#!/bin/sh//bin/false || exec "$(command -v nodejs || command -v node)" "$0"
lennartcl 2017年

2
注意あなたがLinux上でノードに引数を渡すことができないなど、--experimental-modulesあなたがこれを使用する場合、envシェバング行を。周りにはハックがありますが、それらは醜いです。
ダンダスカレスク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.