インタープリターによって実行されるスクリプトは、通常、最上部にシバン行があり、OSに実行方法を指示します。
という名前のスクリプトがfoo
あり、その最初の行がである#!/bin/sh
場合、システムはその最初の行を読み取り、に相当するものを実行し/bin/sh foo
ます。このため、ほとんどのインタープリターは、スクリプトファイルの名前をコマンドライン引数として受け入れるように設定されています。
に続くインタープリター名#!
は絶対パスでなければなりません。OSはあなた$PATH
を検索してインタープリターを見つけません。
で実行するスクリプトがある場合node
、最初の行を書く明白な方法は次のとおりです。
#!/usr/bin/node
ただし、node
コマンドがにインストールされていない場合は機能しません/usr/bin
。
一般的な回避策は、env
次のコマンドを使用することです(これは、この目的を意図したものではありません)。
#!/usr/bin/env node
スクリプトがと呼ばれるfoo
場合、OSは同等のことを行います
/usr/bin/env node foo
env
コマンドは、名前がそのコマンドに任意の次の引数を渡し、そのコマンドラインで指定された別のコマンドを実行します。ここで使用する理由は、コマンドenv
を検索する$PATH
ためです。もしそうnode
でインストールされている/usr/local/bin/node
、とあなたが持っている/usr/local/bin
あなたに$PATH
、env
コマンドが起動します/usr/local/bin/node foo
。
env
コマンドの主な目的は、変更された環境で別のコマンドを実行し、コマンドを実行する前に指定された環境変数を追加または削除することです。ただし、追加の引数を指定せずに、変更されていない環境でコマンドを実行するだけです。この場合は、これで十分です。
このアプローチにはいくつかの欠点があります。最新のUnixライクなシステムには/usr/bin/env
がありますが、env
コマンドが別のディレクトリにインストールされている古いシステムで作業しました。このメカニズムを使用して渡すことができる追加の引数には制限がある場合があります。ユーザーがにnode
コマンドを含むディレクトリを持たない場合$PATH
、またはと呼ばれる別のコマンドを持っている場合node
、間違ったコマンドを呼び出すか、まったく機能しない可能性があります。
その他のアプローチは次のとおりです。
- コマンド自体
#!
へのフルパスを指定する行を使用して、node
さまざまなシステムで必要に応じてスクリプトを更新します。または
node
スクリプトを引数としてコマンドを呼び出します。
トリックの詳細については、この質問(および私の回答)も参照してください#!/usr/bin/env
。
ちなみに、私のシステム(Linux Mint 17.2)では、としてインストールされてい/usr/bin/nodejs
ます。私のメモによると、それはUbuntu 12.04と12.10の間でに変更され/usr/bin/node
ました/usr/bin/nodejs
。#!/usr/bin/env
それとトリックしませんヘルプ(あなたは、シンボリックリンクまたは類似のものを設定していない限り)。
更新:mtraceurによるコメントは(再フォーマット済み)と述べています。
nodejsとnodeの問題の回避策は、次の6行でファイルを開始することです。
#!/bin/sh -
':' /*-
test1=$(nodejs --version 2>&1) && exec nodejs "$0" "$@"
test2=$(node --version 2>&1) && exec node "$0" "$@"
exec printf '%s\n' "$test1" "$test2" 1>&2
*/
これは最初に試行nodejs
してから試行しnode
、両方が見つからない場合にのみエラーメッセージを出力します。説明はこれらのコメントの範囲外です。この回答が問題を提起したので誰かが問題に対処するのに役立つ場合に備えて、ここではそのままにしておきます。
私は最近NodeJSを使用していません。私が最初にこの回答を投稿してから数年でnodejs
vs.のnode
問題が解決されたことを願っています。Ubuntu 18.04では、nodejs
パッケージは/usr/bin/nodejs
へのシンボリックリンクとしてインストールされ/usr/bin/node
ます。以前の一部のOS(UbuntuまたはLinux Mint、どちらかはわかりません)では、へのシンボリックリンクとしてnodejs-legacy
提供さnode
れるパッケージがありましたnodejs
。すべての詳細が正しいことを保証するものではありません。
node