Node.jsでshebang行を指定する
Node.jsでスクリプトを記述する場合、次のようなshebangを書けばスクリプト名で起動できるようになります。
#! /usr/bin/env node
JavaScriptで#
はコメントを意味しませんが、Node.jsでは1行目がshebang行だった場合は無視してくれるのです。助かりますね。
しかし、nodeコマンドにオプションを指定したいような場合はうまくいかないことがあります。
#! /usr/bin/env node --experimental-modules
実は、上記shebangが期待通りに動くかは環境依存で、Linux上では期待通りに動きません。Linux上で起動すると次のようなエラーが出てしまいます。
/usr/bin/env: node --experimental-modules: No such file or directory
Linux上ではshebangの第一引数の後ろは全て第二引数としてまとめられてしまい、 node --experimental-modules
というコマンドがないため怒られてしまうのです。理不尽ですね。
shebangでNode.jsのオプションを指定する方法
Linuxの制約を回避するには、シェルスクリプトとしてもJavascriptとしても正しいshebang行を書く必要があります。
具体的には次のように書くことができます。
#!/bin/sh
":" //# ; exec /usr/bin/env node --experimental-modules "$0" "$@"
2行目がシェルスクリプトとしてもJavascriptとしても正しいのがミソです。
:
はシェルスクリプトで何もしないビルトインコマンドです。その後ろをセミコロンで区切って本来起動したいNode.jsをexecコマンドで起動しています。シェルスクリプトのexecはシェル自身のプロセスを置き換えて外部コマンドを実行するので、以降の行はシェルスクリプトとして実行されません。
Node.js起動後、再び2行目がJavaScriptとして解釈されますが、文字列の後ろにコメントがあるという状態になり、何の処理も行わないので無害だというわけです。3行目以降は普段通りJavaScriptを記述すれば期待通り動作します。
なかなか頭おかしい(褒め言葉)ですね。
参考資料
本稿の内容は下記ページに書いてあった内容そのものです。面白い内容だと感じたので紹介してみました。