インタープリターによって実行されるスクリプトは、通常、最上部にシバン行があり、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を使用していません。私が最初にこの回答を投稿してから数年でnodejsvs.のnode問題が解決されたことを願っています。Ubuntu 18.04では、nodejsパッケージは/usr/bin/nodejsへのシンボリックリンクとしてインストールされ/usr/bin/nodeます。以前の一部のOS(UbuntuまたはLinux Mint、どちらかはわかりません)では、へのシンボリックリンクとしてnodejs-legacy提供さnodeれるパッケージがありましたnodejs。すべての詳細が正しいことを保証するものではありません。
node