Universal Node.js shebang?

Universal Node.js shebang?

Node.js最近はかなり人気があり、それを利用してスクリプトを作成しています。残念ながら、互換性が問題です。正式にNode.jsインタプリタはとして呼び出される必要がありますnodeが、DebianとUbuntuはnodejs

私はできるだけ多くの状況で利用できるNode.js移植可能なスクリプトが欲しいです。ファイル名がと仮定すると、foo.jsスクリプトは2つの方法で実行されることを望みます。

  1. ./foo.jsnodeまたはがnodejsある場合は、スクリプトを実行してください$PATH
  2. node foo.jsまた、スクリプトを実行します(インタプリタが呼び出されると仮定node)。

メモ:xavierm02と私の答えは、多言語スクリプトの2つのバリエーションです。私は純粋なshebangソリューションが存在する場合はまだ興味があります。

ベストアンサー1

私が思いついた最高のものは、実際にはマルチ言語(Bourne shell / Node.js)スクリプトである「2行シェバン」です。

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

console.log('Hello world!');

明らかに、最初の行はBourne shell shebangです。 Node.jsは見つかったすべてのshebangをバイパスするので、Node.jsに関する限り、これは有効なJavaScriptファイルです。

:2行目は引数を使用してシェルのno-opを呼び出し、//ファイル名を引数として実行しますnodejs。移植性の代わりに使用されます。コマンドの代替構文は厳密に言えばBourneではないため、1980年代にこのコマンドを実行する場合はバックティックを選択してください。nodecommand -vwhich$(...)

Node.jsは何もしないかのように動作する文字列を評価し、':'残りの行はコメントとして解析されます。

ファイルの残りの部分は普通の古いJavaScriptです。サブシェルはexec2 行目の完了後に終了するため、シェルはファイルの残りの部分を読み取ることはありません。

インスピレーションを受けたxavierm02と、追加情報をいただいたコメントの投稿者に感謝します。

おすすめ記事