12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2019-02-06

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を記述すれば期待通り動作します。

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

参考資料

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

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?