scriptsフォルダのインタプリタをポータブルに指すshebangを作成します。

scriptsフォルダのインタプリタをポータブルに指すshebangを作成します。

file.jsnodejs(実際にはiojs)を介してコマンドラインシェルスクリプトとして実行したいJSファイル()があります。 WindowsでMINGW Git Bashを使用しています。

標準的なアプローチは、次のshebangをJSファイルに入れることです。

#!/usr/bin/env node

しかし、V8ハーモニー機能を有効にするために、コマンドラインフラグをノードに渡したいと思います。つまり、次のような機能が必要です。

node --harmony_arrow_functions file.js

次のように実行すると

./file.js

フラグを手動で渡す必要はありません。

使用

#!/usr/bin/env node --harmony_arrow_functions

動作しません。

検討した後https://stackoverflow.com/a/8108970/245966そしてhttps://stackoverflow.com/a/5735690/245966次のソリューションを作成しました。

$ ls
file.js nodeharmony.sh

$ cat nodeharmony.sh
#!/bin/sh
exec node --harmony_arrow_functions "$@"

$ cat file.js
#!/bin/sh nodeharmony.sh               # or ./nodeharmony.sh, doesn't matter
console.log("Hello world")

$ ./file.js    # this works fine
Hello world

しかし、問題は、別のフォルダで実行するときにシェルが次の代わりnodeharmony.shに現在の作業ディレクトリを見つけようとすることですfile.js

$ cd ..
$ ./subfolder/file.js
/bin/sh: ./nodeharmony.sh: No such file or directory

()でカスタム通訳を提供せずにすべてのフォルダで実行できるfile.jsポータブルシェバンを作成する方法はありますか?file.jsnodeharmony.shPATH

編集する:

JSファイルは有効なJavaScriptファイルのままである必要があるため、最初の行を#!超えることはできません。つまり、私がfile.js次に変更した場合

#!/bin/sh
exec $(dirname $0)/nodeharmony.sh "$0"
console.log("Hello world")

その後、シェルはディレクトリ名とパラメータを正しく渡しますが、ファイルが有効なJSコードではないため、ノード側で失敗します。

$ ./subfolder/file.js
d:\CODE\subfolder\file.js:2
exec $(dirname $0)/nodeharmony.sh $0
     ^
SyntaxError: Unexpected identifier
    at exports.runInThisContext (vm.js:54:16)
    ...

編集2:

また、スクリプトを実行する可能性も維持したいと思います。

./file.js

また

node --harmony_arrow_functions ./file.js

したがって、sedファイルの内容をハッキングしてヘッダーを削除してから、shebangのノードにパイプすることをお勧めします。この場合、後者の実行が不可能であるため、それは良いことではありません。

答え1

編集:(元の答えはまだ指定された質問に答えますが、file.jsを有効なJSファイルにしませんshebang + 1st-line-combination)提供することです。node

#!/bin/sh
sed '1,2d' $0 |node --harmony_arrow_functions; exit $?
/* Your JS code begins here */

---元の答えの下---

インタプリタがインタプリタファイルと同じディレクトリにあると確信できる場合(説明されている問題)$(dirname $0)

例:

#!/bin/sh
exec $(dirname $0)/nodeharmony.sh "$0" "$@"

この場合、実行時に

$ cd ..
$ ./subfolder/file.js

解釈され$(dirname $0)、execがインタプリタ./subfolderとして使用されます。./subfolder/nodeharmony.sh

答え2

これを行うには、有効なシェルスクリプトでもあるNodeスクリプトを生成できます。

#!/bin/sh
//usr/bin/env node --harmony_arrow_functions "$0" "$@"; exit $?

console.log("Hello world")

別の名前で保存すると、file.jsどこでも実行できるスクリプトが生成されます。これは//同等に依存します/。 Windowsではこれをテストしていません。

関連情報