node.jsでコマンドを作る

```console $ command.js ``` こういう風にコマンドとして使えるプログラムを書く方法。 (ruby版はこちら:[rubyでコマンドを作る](https://bootcamp.fjord.jp/articles/40)) ## helloコマンド `hello`と表示するプログラムを書く。 `hello.js`というファイルを下記の内容で作る。 ```javascript console.log('hello') ``` ```console $ node hello.js hello ``` できました。 ## 直接実行できるプログラム 上記のプログラムは`node`コマンド経由でjavascriptスクリプトを実行している感じが出てしまっているので、直接実行できるようにする。 [shebang](https://fjord.jp/kuroigamen/8.html)の追加 `hello.js:` ```javascript #!/usr/bin/env node console.log('hello') ``` ```console $ ./hello.js zsh: permission denied: ./hello.js ``` ```zsh $ ls -l total 8 -rw-r--r-- 1 komagata staff 34 6 18 15:38 hello.js ``` このままじゃ実行権限が無いので実行できない。 userでの実行権限を追加する。 ```console $ chmod u+x hello.js ``` ```console $ ls -l total 8 -rwxr--r-- 1 komagata staff 34 6 18 15:38 hello.js ``` ```console $ ./hello.js hello ``` 実行権限が追加されたので実行できた。 ## パスを省略して実行する ```console $ ./hello.js ``` 今いる場所からの相対パスである`./`この部分がダサい。 ```console $ hello.js ``` コマンドっぽく実行するにはこうやりたい。 これを省略できるようにするにはPATHの通ったディレクトリにおけば良い。 環境変数`PATH`を見てみる ```console $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ``` `:`区切りでPATHに設定されているディレクトリが出ている。これらはデフォルトから設定されている場所で、大事なものばかり入っているので自分用のディレクトリを追加してみる。 ```console $ mkdir ~/bin ``` 自分のコマンド置き場を作成。 ```console $ export PATH=$PATH:~/bin ``` ```console $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/komagata/bin ``` `/Users/komagata/bin`が増えてる。 このディレクトリに先ほどの`hello.js`コマンドを移動させる。 ```console $ mv hello.js ~/bin/ ``` ```console $ hello.js hello ``` PATHを省略して実行できるようになった。 ## PATHの設定を永続化する 上記の`export`コマンドで設定したPATHはTerminalを抜ける(ログアウト)すると消えてしまうので永続化するには`~/.zshrc`などの設定ファイルに書く必要がある。 `~/.zshrc:` ```sh export PATH=$PATH:~/bin ``` こうしておけば常にPATHはこの設定になってます。 ## 拡張子が気になる? ```console $ hello.js hello ``` 拡張子があるとコマンドっぽく無いからファイル名を`hello`に変えるとさらにそれっぽく見える。 ```console $ hello hello ``` ## 自分用コマンドをたくさん作ろう `~/bin`に自分用のコマンド(スクリプト)を入れておくのはよくあるパターンです。またGitHubなどにアップしておけば他のパソコンでも使いやすいです。 頻繁にやる提携処理や自動化したい時はスクリプトを書いてここに入れておこう。