file.js
nodejs(実際には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.js
nodeharmony.sh
PATH
編集する:
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