この記事について
この記事では、ターミナルで使える自作コマンドを一から作って、使えるようにするための手順を紹介します。
使用する環境・バージョン
- OS : MacOS Mojave ver 10.14.5
- bash : Copyright (C) 2007 Free Software Foundation, Inc.
前提条件
- 自作コマンドはディレクトリ
~/command
に作成します。
読者に要求する前提知識
- 「パスを通す」の意味がわかり、実際にできること。
- shellスクリプトが書けること。
自作コマンドの作り方
1.コマンドファイルを作る
今回は、aaa
という名前のコマンドを作ることにします。
そのため、ディレクトリ~/command
中にaaa
という名前のファイルを作ります。
注:拡張子はなしで作ります。
$ cd ~/commmand
$ touch aaa
作ったaaa
ファイルの一行目に、以下のように記述します。
#!/bin/sh
2.シェルスクリプトを書く
これで準備はできたので、あとは二行目以下に望み通りの機能を実現するシェルスクリプトを書くだけです。
ここでは、コマンドを作るという観点で便利なコーディングを紹介したいと思います。
コマンドの引数を処理する
コマンドには、引数という形でシェルスクリプトに値を渡すことができます。
$ command aaa 引数1 引数2 ... 引数n
この引数はシェルスクリプトの中で$1
,$2
…$n
という風に設定されています。
実際に、スクリプトに以下のように記述します。
echo "$1"
echo "$2"
echo "$3"
この状態でコマンドに引数をつけて実行すると、以下のように出力されます。
$ aaa one two three
one
two
three
このように、第一引数one、第二引数two、第三引数threeが認識されています。
参考:UNIX & Linux コマンド・シェルスクリプト リファレンス 引数を処理する
コマンド名を認識する
今実行しているコマンド名aaa
をスクリプト中で取得するためにはどうしたらいいでしょうか。
実は、実行コマンドのパスが「0番目の引数」にあたります。
実際に0番目の引数を表示するようなコマンドを作ってみます。
echo "$0"
これを実行すると、以下のような出力が得られます。
$ aaa
/Users/username/command/aaa
確かに0番目の引数がパスを指しているのがわかります。
コマンド名aaa
だけを取得するためには、以下のようにします。
echo "$(basename ${0})"
$ aaa
aaa
コマンドのオプションを処理する
コマンドには、引数以外にも、-a
のように、「ハイフン+アルファベット一文字」の形でも値を渡すことができます。(オプション)
$ command aaa -a -b test
上のコマンドだと、オプション-a
と、testの値付きのオプション-b
が指定されています。
オプションの処理をするためには、getopts
コマンドを使用します。
while getopts ab: OPT; do
case $OPT in
a ) FLG_A="TRUE" ;;
b ) FLG_B="TRUE" ; VALUE_B="$OPTARG" ;;
esac
done
1行目のwhile文にgetopts
が使われています。
第一引数には取りうるオプションを並べます。オプション-a
には値がないのでそのままa
と記載、オプション-b
には値がつくのでb:
と記載します。
第二引数OPT`にはコマンド実行時に使われたオプションアルファベットが格納されます。
上記のスクリプトにすることで、以下の形でそれぞれのオプションの有無・その値が取得できます。
- オプション-aが存在 → 変数
FLG_A
に"TRUE"
が格納される - オプション-bが存在 → 変数
FLG_B
に"TRUE"
が格納される + 変数VALUE_B
に-bについた値が格納される
参考:シェルスクリプトでオプション付きのコマンドを作成する
参考:Bash の getopts でロングオプションを処理する
3.実行する準備をする
せっかく作った自作コマンドですが、そのままでは使うことができません。
そのため、作ったスクリプトをきちんとコマンドとして認識させましょう。
参考:シェルスクリプトで自作コマンドを作成する
3.1-1 パスを通す
作ったコマンドがあるディレクトリ~/command
にパスを通します。
$ vi .bash_profile
export PATH=$HOME/command:$PATH
3.1-2 シンボリックリンクを貼る
~/command
にパスを通す代わりに、~/command/aaa
にシンボリックリンクを貼ってもよいです。
$ ln -si ~/command/aaa /usr/local/bin
3.2 自作コマンドのスクリプトに権限を付与
これでコマンド自体は認識されるようになりますが、このままだと権限エラーが出てしまいます。
$ aaa
bash: /Users/username/command/aaa: Permission denied
そのため、作ったスクリプト~/command/aaa
に権限を付与します。
$ chmod 777 ~/command/aaa
これで自作コマンドaaa
が使えるようになりました!
$ aaa
(指定の動作)