🐚

(外部)コマンドの作り方

2023/09/16に公開

概要

コマンドを作る過程でシェルスクリプト、実行権限の付与、shebang(シバン)、PATHの通し方も整理します。

反対に、コマンドから実行ファイルの実態を遡る確認作業は以下行っています。
https://zenn.dev/y__adler/articles/879e2a23df26d5

コマンドの種類

コマンドには組み込みコマンドと外部コマンドの二種類があります。
どっちなのかはtypeコマンドで調べることができます。

組み込みコマンド

  • which等
  • シェル自体に内蔵しているコマンド

外部コマンド

  • brew等
  • 実行ファイルとして定義されている
    →つまり、実行ファイルを作成してしまえばコマンドを自作することもできるということです。

①コマンドライン作成

コマンドを組み合わせたオリジナルのコマンドラインを作成します。
これはホームディレクトリのファイル使用量を表示するコマンドです。

$ du -h ~ | tail -n 1
1.8G	/Users/yuri

しかし毎回ターミナルに直接入力するのは面倒です。
なので、このコマンドラインをファイルに記述し代わりにそれを実行することにします。

②シェルスクリプトの作成

コマンドラインを記述したファイルのことをシェルスクリプトと呼びます。
拡張子なくても問題ないので、コマンドっぽくするために今回は付けません。(ホームディレクトリ直下に作成)

homesize
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」でこのシェルスクリプトが実行される、ということです。

homesize
#!/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を通します。

  1. 独自のコマンドを配置するのによく用いられる~/binディレクトリを作成
  2. 実行したいシェルスクリプトを~/binに移動させる
  3. サーチパスの末尾に~/binを追記する
ターミナル
$ mkdir ~/bin
$ mv homesize ~/bin
$ open ~/.zshrc
~/.zshrc
PATH="$PATH:$HOME/bin"
ターミナル
$ source ~/.zshrc
$ homesize
1.8G	/Users/yuri
$ which homesize
/Users/yuri/bin/homesize

homesizeという単語だけで処理を実行することができたので、コマンド完成です。

参考

新しいLinuxの教科書

Discussion