66
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ターミナルで使える自作コマンドを作る

Posted at

この記事について

この記事では、ターミナルで使える自作コマンドを一から作って、使えるようにするための手順を紹介します。

使用する環境・バージョン

  • 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ファイルの一行目に、以下のように記述します。

/command/aaa
#!/bin/sh

2.シェルスクリプトを書く

これで準備はできたので、あとは二行目以下に望み通りの機能を実現するシェルスクリプトを書くだけです。
ここでは、コマンドを作るという観点で便利なコーディングを紹介したいと思います。

コマンドの引数を処理する

コマンドには、引数という形でシェルスクリプトに値を渡すことができます。

$ command aaa 引数1 引数2 ... 引数n

この引数はシェルスクリプトの中で$1,$2$nという風に設定されています。
実際に、スクリプトに以下のように記述します。

/command/aaa
echo "$1"
echo "$2"
echo "$3"

この状態でコマンドに引数をつけて実行すると、以下のように出力されます。

$ aaa one two three
one
two
three

このように、第一引数one、第二引数two、第三引数threeが認識されています。

参考:UNIX & Linux コマンド・シェルスクリプト リファレンス 引数を処理する

コマンド名を認識する

今実行しているコマンド名aaaをスクリプト中で取得するためにはどうしたらいいでしょうか。
実は、実行コマンドのパスが「0番目の引数」にあたります。
実際に0番目の引数を表示するようなコマンドを作ってみます。

/command/aaa
echo "$0"

これを実行すると、以下のような出力が得られます。

$ aaa
/Users/username/command/aaa

確かに0番目の引数がパスを指しているのがわかります。
コマンド名aaaだけを取得するためには、以下のようにします。

/command/aaa
echo "$(basename ${0})"
$ aaa
aaa

コマンドのオプションを処理する

コマンドには、引数以外にも、-aのように、「ハイフン+アルファベット一文字」の形でも値を渡すことができます。(オプション)

$ command aaa -a -b test

上のコマンドだと、オプション-aと、testの値付きのオプション-bが指定されています。
オプションの処理をするためには、getoptsコマンドを使用します。

/command/aaa
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
~/.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
(指定の動作)
66
58
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?