1. ホーム
  2. node.js

[解決済み] nodeファイルの先頭にある"/usr/bin/env node "は、具体的には何をするのですか?

2022-01-26 09:44:45

質問

このような行を見たことがあります。 #!/usr/bin/env node のいくつかの例の冒頭で nodejs で、ググってみたのですが、その行の理由を答えられるようなトピックは見つかりませんでした。

言葉の性質上、検索はそう簡単ではありません。

いくつか読んでみると javascriptnodejs の本を最近読みましたが、どれも見た覚えがありませんでした。

例を挙げるなら RabbitMQ 公式 チュートリアル ほぼすべてのサンプルにこの機能が搭載されており、そのうちの1つを紹介します。

#!/usr/bin/env node

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: false});
    ch.publish(ex, '', new Buffer(msg));
    console.log(" [x] Sent %s", msg);
  });

  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});

どなたかこの行の意味を教えてください。

この行を入れるか入れないかで、何が違うのでしょうか?どのような場合に必要なのでしょうか?

どのように解決するのですか?

#!/usr/bin/env node のインスタンスです。 シバングライン を使用します。 にある実行可能なプレーンテキストファイルの一番最初の行です。 Unix系プラットフォーム そのファイルを実行するためにどのインタープリタに渡すかをシステムに伝えるものです。 というマジックに続いて、コマンドラインから #! というプレフィックスがあります。 シバング ).

Windows が行います。 ではなく シェバング行をサポート ということで、実質的には 無視 Windowsでは、特定のファイルの ファイル名拡張子 どの実行ファイルがそれを解釈するかを決定します。 しかし、まだ、これらのコンテキストが必要です npm . [1]

以下の通りです。 シェバング線に関する一般的な議論 は、Unix 系プラットフォームに限定されます。

以下の説明では、Node.jsで実行するソースコードを含むファイルを、単に file .

  • あなた この行は必要です Node.jsのソースファイルを呼び出す場合は、以下のようになります。 直接 これは、そのファイルが以下のようなコマンドで実行可能としてマークされていることを想定しています。 chmod +x ./file この場合、例えば次のような方法でファイルを呼び出すことができます。 ./file にリストされたディレクトリのいずれかにある場合は、そのディレクトリを指定します。 $PATH 変数として、単に file .

    • 具体的には、shebang行で CLI Node.jsのソースファイルをベースにしたnpmの パッケージ によってインストールされるCLI(複数可)を含む。 npm の値をもとに "bin" のキーは、パッケージの package.json ファイル も参照してください。 この回答 でどのように動作するかについては グローバルに をインストールする必要があります。脚注 [1] は Windows での扱い方を示しています。
  • あなた は必要ありません。 を使用して明示的にファイルを呼び出す場合は、この行は不要です。 node インタプリタ、例えば node ./file


背景情報(オプション :

#!/usr/bin/env <executableName> ポータブル はインタープリタを指定するものです。 <executableName> にリストされたディレクトリの中で (最初に) 見つけばどこでも構いません。 $PATH 変数に渡す (そして暗黙のうちに手元のファイルへのパスを渡す)。

これは、あるインタプリタがプラットフォームによって異なる場所にインストールされる可能性があるという事実を考慮したもので、これは間違いなく node Node.jsのバイナリです。

これに対して env ユーティリティ自体が 同じ は、すべてのプラットフォームで、すなわち /usr/bin/env - を指定し フル 実行ファイルへのパスは 必須 をshebang行に追加してください。

なお、POSIX ユーティリティの env 再利用 にある実行ファイルをファイル名で検索し、実行するために使用します。 $PATH .
の真の目的は env は、コマンドの環境を管理するためのものです。 env のPOSIX仕様 Keith Thompson氏の回答が参考になります。 .


また、Node.jsでは構文として 例外 は有効な JavaScript コードではないため、シバング行に対して ( # は、POSIXライクなシェルや他のインタプリタとは異なり、JavaScriptではコメント文字ではありません)。


[1] クロスプラットフォームの一貫性を保つために。 npm ラッパー *.cmd Windows上のファイル(バッチファイル) で指定された実行ファイルをインストールする場合、パッケージの package.json ファイル(via. "bin" プロパティ)を使用します。基本的に、これらのラッパー・バッチファイルは ミミック Unixのshebangの機能:それらは shebang 行で指定された実行ファイルを使ってターゲットファイルを明示的に呼び出す。 - このように スクリプトは、たとえ Windows でしか実行するつもりがなくても、shebang 行を含める必要があります。 - 見る この回答 をご覧ください。
以来 *.cmd ファイルを呼び出すことができます。 .cmd このため、Windows と Unix の両方で、効率的に npm -をインストールしたCLIを、拡張子なしのオリジナルの名前で使用することができます。