Edited at

shebangからNode.jsのオプションを指定する


Node.jsでshebang行を指定する

Node.jsでスクリプトを記述する場合、次のようなshebangを書けばスクリプト名で起動できるようになります。

#! /usr/bin/env node

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起動後、同じ行がJavaScriptとして解釈されますが、文字列の後ろにコメントがあるという状態になり、何の処理も行わないので無害だというわけです。

なかなか頭おかしい(褒め言葉)ですね。


参考資料

本稿の内容は下記ページに書いてあった内容そのものです。面白い内容だと感じたので紹介してみました。