[解決済み] nodeファイルの先頭にある"/usr/bin/env node "は、具体的には何をするのですか?
質問
このような行を見たことがあります。
#!/usr/bin/env node
のいくつかの例の冒頭で
nodejs
で、ググってみたのですが、その行の理由を答えられるようなトピックは見つかりませんでした。
言葉の性質上、検索はそう簡単ではありません。
いくつか読んでみると
javascript
と
nodejs
の本を最近読みましたが、どれも見た覚えがありませんでした。
例を挙げるなら
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 での扱い方を示しています。
-
具体的には、shebang行で
CLI
Node.jsのソースファイルをベースにしたnpmの
パッケージ
によってインストールされるCLI(複数可)を含む。
-
あなた は必要ありません。 を使用して明示的にファイルを呼び出す場合は、この行は不要です。
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を、拡張子なしのオリジナルの名前で使用することができます。
関連
-
[解決済み] リソースの読み込みに失敗しました: net::ERR_CONNECTION_REFUSED : Nodejs
-
[解決済み】AWS Lambdaでnodejsの「ref」モジュールを使用すると「invalid ELF header」と表示される件
-
[解決済み】MongooseでEnumを作成し使用する方法
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
[解決済み] usr/bin/env bash」と「#!/usr/bin/bash」の違いは何ですか?
-
[解決済み] ブラウザで動作しているURLで「connect ETIMEDOUT」エラーが発生する原因は何ですか?
-
[解決済み] Node forever /usr/bin/env: node: そのようなファイルやディレクトリはありません
-
[解決済み] なぜ、スクリプトファイルの先頭に#!/bin/bashを付ける必要があるのですか?
-
[解決済み】NodeJs をインストールできない。/usr/bin/env: node: そのようなファイルやディレクトリはありません
-
[解決済み】なぜ #!/usr/bin/env bash は #!/bin/bash よりも優れているのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Google spreadsheet api Requestに不十分な認証スコープがあった。
-
[解決済み】モジュール 'internal/util/types' が見つかりません。
-
[解決済み】"npm update -g" の後に "Cannot find module 'npmlog'" というエラーが発生する。
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] joiライブラリを使用して2つの時間を比較する方法
-
[解決済み] nodejs - http.requestでresponse.writeを使用する場合、第一引数は文字列またはBufferでなければなりません。
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] "app.use(express.cookieSession())" に "secret" オプションが必要です。
-
[解決済み] ノードのバージョンを管理するためのnまたはnvm - 各バージョンのグローバルモジュールを保持することは良いアイデアですか?
-
[解決済み] POSIX」の意味を教えてください。