nodeでjavascriptを実行する場合、通常はnodeにファイルを渡してスクリプトを実行するが短いスクリプトの場合はコマンドラインにスクリプトを書くことができる。ちょっとしたスクリプトを書きたい場合はこうすることですべての情報がコマンドラインにしか存在しないのでよりポータブルになる。しかしコマンドラインの制約から文字列を囲むクォートやダブルクォートが書きにくいので、その点は注意する必要がある。Windowsではシングルクォートは通常の文字のように扱われるので、スクリプト全体をダブルクォートで囲い、スクリプト内部での文字列はシングルクォートで囲むようにする。
次にスクリプトに引数を渡したいときはnodeに渡す引数と区別するために、通常は最後に–(2つのハイフン)をつけて、それ以降の引数はスクリプトに渡されるものであることを指示する。
上記のことを組み合わせて、スクリプト内で引数を受け取り、コマンドラインでスクリプトとそれに渡す引数を渡すことができる。これを応用してnpm runに記述しておけば、ちょっとしたコマンドをpackage.jsonに登録することができる。jsonでダブルクォートを扱うときはバックスラッシュでエスケープすればいいので矛盾は生じない。
nodeでのスクリプトへの引数の渡し方
-eでスクリプトをそのまま指定。
–のあとのコマンドライン引数はスクリプトに渡される。
1 2 3 |
>node -e "console.log('aaa',process.argv[1])" -- bbb aaa bbb > |
スクリプト内では引数はprocess.argvで受け取る。
npm runに引数を渡す
npm runはそのまま実行するだけのようなので以下のように書く。ダブルクォートはバックスラッシュでエスケープする。
1 2 3 4 |
"scripts": { ... "myscript": "node -e \"console.log('aaa',process.argv[1])\" --" }, |
npm runを実行
1 2 3 4 5 6 7 8 |
>npm run myscript ccc > myapp@0.1.0 myscript > node -e "console.log('aaa',process.argv[1])" -- "ccc" aaa ccc > |