エイリアスとシェル関数でコマンドを簡略化しよう

# 長いコマンドを打つのは面倒くさい！

最近、PHP＆Laravelで開発を始めたのですが、Linux上で動作確認用のビルトインサーバーを立てるたびに、以下のコマンドを打つ必要があります。

``` shell
$ php artisan serve --host 0.0.0.0
```

※当方の環境の場合です。`--host 0.0.0.0`が不要な場合もあります。

サーバー立ち上げるたびに、いちいちタイプするのって疲れますよね。
Linux上でPHP以外の言語やフレームワークを使って開発する方も同様に、「このコマンドよく使うけど、長ったらしくていやだなあ」と思うことがあるでしょう。
そのようなコマンドをWindowsのショートカット感覚で手軽にできないかというときに登場するのがエイリアスと関数です。
エイリアスと関数はいずれもシェルに自分で作った新しいコマンドを追加する機能です。
それぞれ、使い方や特徴があるので順に紹介していきたいと思います。

# エイリアスとは
エイリアスはシェルスクリプトのコマンドに別名をつける機能です。
英語で「alias」は別名という意味があります。そのまんまですね。
`alias`コマンドを使って登録を行うことができます。

``` shell:shell
$ alias 登録名="登録するコマンド"
```

これから試しに`alias`コマンドを使って機能を確認したいと思います。
ここでひとつ注意点があります。
コマンドラインから`alias`コマンドを使って登録すると、再起動後使えなくなるというデメリットがあります。
回避法は後半の`.bashrc`の章で解説しておりますので、最後までよろしくお願いします。**

それでは、以下のコマンドを打ってみてください。

```shell
$ alias aliastest="echo 'Alias Test.'"
```
これで新しいコマンド「aliastest」が登録されました。
それでは、続いて`aliastest`コマンドを入力してみましょう。


`echo 'Alias Test.'`を実行すると「alias aliastest」という文字列が表示されます。
`aliastest`コマンドを入力すると、`echo 'Alias Test.'`を入力したのと同じ結果を得ることができます。

```shell
$ aliastest
Alias Test.
```
「Alias aliastest」が表示されましたね。

一度に複数のコマンドを実行するエイリアスを書くためには、';'(セミコロン)を使います。

```shell
$ alias aliastest2='mkdir aliastest;cd aliastest/;touch aliastest.php'
```

上のコマンド`aliastest2`は「ディレクトリaliastestを作成」→「ディレクトリaliastestに遷移」→「aliastest.phpを作成」を一度に行う事ができます。
エイリアスで登録したコマンドを無効化するのは`unalias`コマンドを使います。

```shell
$ unalias aliastest
```

ここで冒頭に先述したとおり、ひとつ**重大な問題点**があります。
**Linux環境やシェルのシステムを再起動すると、コマンドラインから`alias`で登録したコマンドはリセットされてしまいます。**
そこで、エイリアスを永続的に使うためには、`.bashrc`にaliasコマンドを記述する必要があります。
※zshをご利用の方は`bash`を`zsh`、`.bashrc`を`.zshrc`と読み替えてください。他のシェルをご利用の方も同様にご対応お願いします。

# .bashrcで永続的にエイリアスを使えるようにする
`ls -a ~/`のコマンドで、ユーザーのホームディレクトリの中にどんなファイルが入っているか確認してください。
すると、その中に`.bashrc`というファイルがあるはずです。
ない場合はホームディレクトリに移って、`touch`コマンドで同名のファイルを生成してください。
これらのファイルをviなどのテキストエディタで開いて、先程の`alias 登録名=コマンド内容`を記述すると、再起動後も永続的に登録したエイリアスを使うことができます。

```shell
$ vi ~/.bashrc
```

`.bashrc`はシェルを起動するたびごとに１回、実行されます。
そのため、`.bash_profile`を編集後、記述したエイリアスやシェル関数を使えるようにするためには、`bash`コマンドでシェルを再起動させてください。

```shell
$ bash
```

# シェル関数とは
ここまで紹介したエイリアスとは別にもうひとつ、自作コマンドを登録する方法があります。それがシェル関数です。
一般的なプログラミング言語における関数と同じような感覚でコマンドを自作することができます。

```bash:.bashrc
# function aliastest3
aliastest3() {
mkdir aliastest
cd aliastest
touch aliastest.php
}
```
シェル関数`aliastest3`は先程の`aliastest2`と同じ処理を実行します。
今回は詳細を割愛しますが、変数や繰り返し、ifによる条件分岐も可能です。
また、エイリアスには無い特徴として引数を使ったコマンドを作ることができます。

```shell
コマンド 引数1 引数2 引数3 ……
```
上記のコマンドの場合、引数1の文字列・数値が変数`$1`に、引数2の文字列・数値が変数`$2`に、引数3の文字列・数値が変数`$3`……という具合に格納されます。

```bash:.bashrc

aliastest4() {
 mkdir $1
 cd $1
 touch $2
}
```

上のシェル関数`aliastest4`を定義後、`aliastest4 aaa bbb.txt`を行うと、「ディレクトリaaaを作成」→「ディレクトリaaaに遷移」→「bbb.txtを作成」を実行します。

#シェル関数とエイリアスの違い
大きな違いとして、シェル関数は前述の通り引数を指定したり、一般的なプログラミング言語と同様の条件分岐や繰り返しが可能です。
一方で、エイリアスにできて、シェル関数にはできないこととして**既存のコマンドを上書きできる**という利点があります。

それでは、シェル関数とエイリアスのあわせ技として次のスクリプトを御覧ください。

```bash:.bashrc

cdandls() {
 ls -a $1
 cd $1
}
alias cd='cdandls'
```

まず、こちらのシェルスクリプトではディレクトリ遷移とそこにあるファイルを表示するシェル関数`cdandls`を定義しています。
その後、`alias`コマンドで`cd`コマンドをシェル関数`cdandls`の処理を行うコマンドとして上書きしています。

【参考】
https://qiita.com/b4b4r07/items/8cf5d1c8b3fbfcf01a5d
同様のことをやりたい場合は、他にも別解があります。

#最後に
シェルの世界は非常に奥が深いので、カスタマイズに夢中になって開発がおろそかにならないように気をつけてください！
色んな人が自分だけの.bashrcを公開していますので、参考にするのもいいかもしれません。
それでは良き開発ライフを！