(外部)コマンドの作り方
概要
コマンドを作る過程でシェルスクリプト、実行権限の付与、shebang(シバン)、PATHの通し方も整理します。
反対に、コマンドから実行ファイルの実態を遡る確認作業は以下行っています。
コマンドの種類
コマンドには組み込みコマンドと外部コマンドの二種類があります。
どっちなのかはtypeコマンドで調べることができます。
組み込みコマンド
- which等
- シェル自体に内蔵しているコマンド
外部コマンド
- brew等
- 実行ファイルとして定義されている
→つまり、実行ファイルを作成してしまえばコマンドを自作することもできるということです。
①コマンドライン作成
コマンドを組み合わせたオリジナルのコマンドラインを作成します。
これはホームディレクトリのファイル使用量を表示するコマンドです。
$ du -h ~ | tail -n 1
1.8G /Users/yuri
しかし毎回ターミナルに直接入力するのは面倒です。
なので、このコマンドラインをファイルに記述し代わりにそれを実行することにします。
②シェルスクリプトの作成
コマンドラインを記述したファイルのことをシェルスクリプトと呼びます。
拡張子なくても問題ないので、コマンドっぽくするために今回は付けません。(ホームディレクトリ直下に作成)
du -h ~ | tail -n 1
③シェルスクリプトの実行
シェルスクリプトを実行するには$ シェルコマンド シェルスクリプト
という風にシェルコマンドの引数としてシェルスクリプトを指定します。
以下のようにして実行することができました。
$ zsh ./homesize # 相対パス
1.8G /Users/yuri
$ zsh ~/homesize # チルダ展開による絶対パス
1.8G /Users/yuri
zshコマンドを記載せずにもっと短くしたいです。
④実行権限付与
シェルスクリプトに実行権限を与えます。
$ chmod +x homesize
⑤shebangの追記
シェルスクリプトにshebangとしてシェルコマンドを追記し、インタプリタとして指定します。
#!の後ろにはコマンドが来ます。
なので今回はシェルコマンド「/bin/zsh」でこのシェルスクリプトが実行される、ということです。
#!/bin/zsh
du -h ~ | tail -n 1
$ ~/homesize
1.8G /Users/yuri
短くなりました。
しかし、シェルスクリプトのパスを記載していると記述が長くなってしまいます。
そのため、PATHを通してパスを省略できるようにします。
⑥PATHを通す
$ homesize
zsh: command not found: homesize
現状、サーチパスの配下にhomesizeという名前のコマンドはないということです。
サーチパスというのはシェルからコマンドを実行する際に、コマンドの実態ファイルであるシェルスクリプトを探すディレクトリのことです。
サーチパスは環境変数PATHに登録されていて$ echo $PATH
で中身を見れます。
homesizeというコマンドの実態ファイルはホームディレクトリ配下にありますが、ホームディレクトリはサーチパスとして登録されていないので、ファイル名だけでは実行できないのです。
通常は環境変数PATHにディレクトリを登録するか、既にPATHが通っているディレクトリにシェルスクリプトを移すかです。
ですが今回は以下の手順でPATHを通します。
- 独自のコマンドを配置するのによく用いられる~/binディレクトリを作成
- 実行したいシェルスクリプトを~/binに移動させる
- サーチパスの末尾に~/binを追記する
$ mkdir ~/bin
$ mv homesize ~/bin
$ open ~/.zshrc
PATH="$PATH:$HOME/bin"
$ source ~/.zshrc
$ homesize
1.8G /Users/yuri
$ which homesize
/Users/yuri/bin/homesize
homesizeという単語だけで処理を実行することができたので、コマンド完成です。
Discussion