【超初心者向け】エイリアスを使ってターミナルで爆速効率を目指す

**DMM WEBCAMP AdventCalendar**の10日目を担当いたします、@solare_tech です。
大雑把にいうと、DMM WEBCAMP運営部の中の人の1人です。何卒よろしくお願いします。

# めんどくさいコマンドを簡略化できるエイリアス

みなさん、ターミナル使いこなしてますか？
プログラミングに取り組む上で、**ターミナルのコマンドが複雑**と感じる人は結構多いんじゃないかなと思っています。
一つの動作を実行するのに、いちいち長いコマンドを入力するのは面倒ですし、もっと簡略化したい……。
そんな願いを叶えてくれる便利なヤツが、**エイリアス**です。

# ターミナルを知ろう
エイリアスとは何かを説明する前に、エイリアスというものを取り巻くターミナルについて説明していきます。
ここでは、まず**イメージを持ってもらう**ことを重視しますので、具体的なコマンドやスクリプトの記法については、そんなに話しません。
指摘、疑問のコメントは大歓迎です！！

## キーワード

### ターミナル
コマンドを使ってパソコンを操作するための、Macアプリケーションです。
後述しますが、Windowsでは**[Git Bash](https://gitforwindows.org/)**などを導入することで、同じ動きができます。

### コマンド
ターミナルでパソコンを操作するための命令文です。

### シェル
パソコンの中身と我々人間をつなぐ受付係。
我々人間は、ターミナルを介して「パソコンさんにこういう動作をお願いしたいんだけど」とお願いをします。
このお願いの部分が、**コマンド**です。

### bash
シェルさんの進化系。
macOSのターミナルやWindows用のGit bashなどには、このbashという名前の受付係さんが待機しています。
進化した分、シェルさんより仕事の効率が良いらしいですが、今のところ、違いは意識しなくても問題ありません。

【参考】[bashとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11786.html)

#### 参考 : bashの仲間
bashと同じような仕事をする仲間として、zsh、cshなどがあります。違う会社の受付をしていたり、一つの会社の中でbashさんやzshさんが受付を担当していたりと、形はさまざまです。

### エイリアス
ここで、いよいよエイリアスの登場です。
エイリアスとは、ざっくりいうと、**bashさんが知っている略語**です。

略語というと、皆さん何を思い浮かべますか？

例えば、**「ググる」**という言葉。
この言葉は、「Googleで検索して、意味を調べる」という略語です。

また、今年流行ったタピオカドリンクに関連して生まれた、**「タピる」**という言葉。
これは「タピオカドリンクを買って飲む」という意味の略語になります。

このように、「別の行動を略語として言い表しているもの」が、エイリアスです。

|エイリアス|実際に行うこと|
|---|---|
|ググる|Googleで検索して、意味を調べる|
|タピる|タピオカドリンクを買って飲む|


### .bashrc / .bash_profile
この後、`.bashrc`と`.bash_profile`というふたつのファイルを編集していただきます。
ざっくり言うと、これらは**bashさんのお仕事マニュアル**です。
bashさんが我々人間の応対を行うときに必要な知識が、ここに書かれています。

そして、bashさんが使える`エイリアス=略語`も、ここに書かれています。

bashさんは、全く初めての状態から**「タピる」**という略語を知っているわけではありません。
**`.bashrc`に「タピる」という言葉が書かれて初めて、「タピる=タピオカドリンクを買う、飲む」という意味を知る**のです。

言い換えると、`.bashrc`にエイリアスを追加してあげることで、bashさんはエイリアスを意味のある略語として理解することができます。

また、bashさんのマニュアルには
 `.bash_profile` `.bashrc`
の二つがあります。

これも大まかに説明すると
 `.bash_profile`：ターミナルへのログイン時にbashが確認するマニュアル
　**→朝一番で出勤して、誰よりも早く受付に立つ前に目を通すイメージ**
 `.bashrc`：他の係員(zshなどの他のシェル)と交代したときにbashさんが確認するマニュアル
　**→昼から出勤して、別の人と交代した時に目を通すイメージ**

この辺りは、実際にエイリアスを書くときに詳しく説明します。

# エイリアスを作ってみよう
## .bashrcを書き換えてみよう
### 1. 何はともあれやってみよう
まずは`.bashrc`を書き換えてみましょう。
先ほどお伝えした通り、ここに略語をどんどん登録していきます。

Macであればターミナル、WindowsであればGit Bashなどを開いてみましょう。
開いたら、まず下記のコマンドを打ってみましょう。
(以下、Windowsの方は「ターミナル」を"Git Bash"などに読み替えてください。)

```Terminal:ターミナル
vi ~/.bashrc
```

すると、ターミナル上で`vi`というテキストエディタが起動します。
何か記述されていたり、されていなかったりするかもしれませんが、一番最後の行に下記を追加しましょう。


```Shell:~/.bashrc
alias tapioka="echo 'タピオカ最高〜〜〜〜！！！！'"
```

追加したら、`:wq`で保存終了し、下記のコマンドを打ち込んでいきましょう。

```Terminal:ターミナル
$ source ~/.bash_profile
```

ここでエラーとなった場合は、2に進んでみましょう。
エラーにならなかった場合は、下記のエイリアスを打ち込んでみましょう。

```Terminal:ターミナル
$ tapioka
タピオカ最高〜〜〜〜！！！！
```
**このように表示されれば成功です！**


### 2. 上手くいかなかった場合
 `.bash_profile`が存在しないか、下記の記述が足りていないかもしれません。
いずれの場合も、下記の手順で対応しましょう。

```Terminal:ターミナル
$ vi ~/.bash_profile
```
開けたら、下の一行を追加しましょう。

```Bash:.bash_profile
source ~/.bashrc
```

`:wq`で保存終了し、再度下記のコマンドを打ち込みます。

```Terminal:ターミナル
$ source ~/.bash_profile
```

改めて、下記のエイリアスを打ち込んでみましょう。

```Terminal:ターミナル
$ tapioka
タピオカ最高〜〜〜〜！！！！
```
**このように表示されれば成功です！**


### 結局何をやっていたの？
一つ一つの要素を見ていきましょう。

`alias`は、略語を設定するためのスクリプトです。

`alias [略語]="[略語を打ち込んだ時に発動するコマンド]"`

今回は試しに、`tapioka`というエイリアス(=略語)を作っていきます。
`tapioka`というエイリアスを入力した時に、ターミナル上に**「タピオカ最高〜〜〜〜！！！！」**と表示されるようにします。

通常、ターミナル上に文字を表示させたいときは、`echo`コマンドを作ります。
試しにターミナルにechoコマンドを打ち込んでみましょう。

```Terminal:ターミナル
$ echo 'タピオカ最高〜〜〜〜！！！！'
タピオカ最高〜〜〜〜！！！！
```

しかし、~~いくらタピオカが大好きでも~~いちいち`echo 'タピオカ最高〜〜〜〜！！！！'`を打ち込んでいると面倒なので、これを`tapioka`というエイリアスとしてまとめます。

`alias [略語]="[略語を打ち込んだ時に発動するコマンド]"`
　　↓
`alias tapioka="echo 'タピオカ最高〜〜〜〜！！！！'"`
*注："="の両側にはスペースを一切入れないでください！！*

これで`.bashrc`の記述は完成です！

ただ、せっかく更新した`.bashrc`も、変更点がbashさんに伝わらなければ意味がありません。
マニュアルが更新されたのに、全く読まれていない状況です。

そこで、bashさんにエイリアスの内容を読み込ませるために、`source`コマンドを使います。
`source`は、**「指定した場所にあるマニュアルを、bashさんに読み込ませて覚えてもらうコマンド」**です。

しかし、ここはシンプルには行きません。
なんと、3ステップを踏んで頂きます。

まずこうして

```Terminal:ターミナル
$ vi ~/.bash_profile
```

こうして

```bash:~/.bash_profile
# もし下記の一文が無ければ、追加し、保存終了。
 source ~/.bashrc
```

こうです！

```Terminal:ターミナル
$ source ~/.bash_profile
```

……何をやっているのかというと

1. `.bash_profile`をテキストエディタで開いて
2. `source ~/.bashrc`を追加し、保存終了
3. ターミナルで`$ source ~/.bash_profile`を実行し、bashさんに`.bash_profile`を読みこんでもらう

「書き換えたのは`.bashrc`なのに、読み込むのは`.bash_profile`？」
「てか、`.bashrc`だけ読みこんでもらえば良いのでは？」
もしかしたら、こんなこと思った人もいるかも知れません。

`.bash_profile`は、ターミナルへのログイン時にbashさんが確認するマニュアルと説明しました。
一般的には、**ターミナルを起動した時に読み込まれるマニュアル**だとお考えください。

一方で、`.bashrc`は**他の受付係員からbashさんに交代した時に、bashさんが読み込むマニュアル**です。
あまりイメージが沸かないかもしれませんが、同じターミナルでbashやzshなど、いくつかのシェルを使うことがあります。そんな時、切り替え=他の受付係員との交代が発生します。
今のところは「へ〜別の係員になる時があるんだ〜」くらいに考えておいてください。

エイリアスは、どんな状況でも使えるのが理想ですが、`.bashrc`と`.bash_profile`、どちらかに記述されているだけだと、使える時と使えない時が発生します。
これに対して、頭のいい人は考えました(多分)。

**「ログイン時に読み込む`.bash_profile`に、`.bashrc`を読み込むように指示書いちゃえば
　どんな時も全部のマニュアルに目を通してくれるんじゃない？」**

かくして、`.bash_profile`に下の一文を追加した上で、

```bash:~/.bash_profile
 source ~/.bashrc
```

下のように、もう一回、`.bash_profile`を読み込ませる

```Terminal:ターミナル
$ source ~/.bash_profile
```

そんな、ややこしいことになったのでした。

ちなみに、`.bash_profile`はターミナルを起動しても読み込まれるので、`$ source ~/.bash_profile`の代わりに、ターミナル自体を再起動してもOKです。

### まとめ
1. エイリアスを`.bashrc`に書き込み、保存
2. `.bash_profile`に一行追加し、`source ~/.bashrc`を追加、保存
3. `$ source ~/.bash_profile`、もしくはターミナルの再起動
4. エイリアスが使えるようになる！

## エイリアスのルール
使い方が分かったところで、いよいよ実践です。色々なコマンドをエイリアス化していきましょう！
ただし、何でもかんでもエイリアスにしてしまうのはかえって混乱を招きます。
エイリアスのルールをあらかじめ自分で決めておくことで、エイリアスの乱立を防ぎましょう。

参考までに、私がエイリアスを作るときに決めているルールをお示しします。

1. 必ず1日に一回は使う→**よく使うコマンドの簡略化**
2. 処理が複数あり、その複数の処理が一連の動作として決まっている→**よくやる処理のパッケージ化**

どちらかに当てはまるコマンド・処理について、エイリアスを作るようにしています。

## よく使うコマンドの簡略化
### case : よく使うディレクトリへのショートカットコマンドを作成する

多くの方はデスクトップ等に作業ディレクトリを作り、その中にアプリやコードを格納しているのではないでしょうか。
例えば、デスクトップにあるhogehogeフォルダの中にwork_directoryというフォルダを作り、そこにアプリのディレクトリなどを作成しているとすると、ターミナルを起動するたびに
`$ cd Desktop/hogehoge/work_directory`
と打ち込む必要があります。
一回であれば良いですが、毎日毎日同じ作業だとなんだか面倒ですよね。なので、エイリアスにしましょう。

```bash:〜・.bashrc
alias wk=‘cd ~/Desktop/hogehoge/work_directory‘
```
"work_directory"の"work"→"wk"をエイリアスとしました。
エイリアスを定義する時、cdに指定するパスに、ホームディレクトリから始める絶対パスを使用しているので、どのディレクトリに居ても作業ディレクトリに移動できます。

## 【応用】よくやる処理のパッケージ化

今までのエイリアスは、一つのコマンドに対して一つのエイリアスを設けていましたが、複数のコマンドをまとめる方法があります。それが`function`です。

functionとは、**複数の処理をまとめて書くやり方**です。関数とも言われます。
エイリアスは、基本的に一つの処理を置き換えることしかできませんが、これを合わせ技で使うことで複数の処理をエイリアスでまとめられます。

下記で、hogehogeという名前のfunctionについて見てみましょう。

```bash
function hogehoge() {
  # 上から順番に処理が実行される
  処理1
  処理2
}

# エイリアスをabとして、hogehogeの中身(処理1、処理2)を実行する
alias ab=hogehoge
```
このように書くことで実現できます。
ここで、関数の場合はダブルクォーテーション(")で囲まないことに注意しましょう。

### case : ディレクトリを移動した瞬間に、ディレクトリの中身を表示する
ディレクトリを移動した時に個人的によくやるのが、その先にどんなファイルやディレクトリが存在するのかの確認です。コマンドだと、こんな感じになります。

```Termimal:ターミナル
# hogehogeディレクトリに移動
$ cd hogehoge
# hogehogeディレクトリの中身を全て表示
$ ls -a
```

これについて、`cd`と入力しただけで上二つの処理を同時に行うようにすることも、エイリアスならできます。

まず、結論からお伝えします。

```bash:~/.bashrc
function cdls() {
  # cdがaliasとして設定されると、ループするので\をつける
  \cd $1;
  ls;
}
alias cd=cdls
```

$1,\cdと、見慣れない書き方が2つも出てきました。

まず、`$1`の説明です。
結論から言うと、「1番目の引数」ということです。

cdというコマンドは、続けて「移動したいディレクトリのパス」を指定しますが、これが「1番目の引数」となります。
コマンドやエイリアスの中には、続けて追加情報をスペースで区切って入力する必要のあるものがありますが、この追加情報が「引数」となります。
例えば
`コマンド(エイリアス) 追加情報1 追加情報2`
となった場合、追加情報1に入力されたデータが`$1`、追加情報2に入力されたデータが`$2`となります。

cdの場合は
`cd 移動先のパス(追加情報1)`
となるため、入力された移動先のパスが`$1`に入ってきます。

まとめると

```bash:~/.bashrc
function cdls() {
  # cdの後に入力された移動先パスに移動
  cd $1;
  # 移動した後に、移動先のディレクトリの中身を表示
  ls;
}

# cdlsとしてまとめた処理を、エイリアスとしてまとめる
alias cd=cdls
```

となります。

最後に、`\cd`の説明です。

cdというコマンドは、もともと存在するものですが、今回`cdというエイリアス`を作ったことで、そちらを優先的に読み込みに行ってしまいます。
エイリアスを読みに行くと、何が起こるでしょう？

1. `$ cd Desktop`とターミナルに入力
2. cd=cdlsなので、`function cdls`を上から順に実行
3. `cd $1`を実行。ここでは$1の中身はDesktopなので、`cd Desktop`となる。
4. cd=cdlsなので、`function cdls`を上から順に実行
5. `cd $1`を実行。ここでは$1の中身はDesktopなので、`cd Desktop`となる。
6. cd=cdlsなので、`function cdls`を上から順に実行
7. `cd $1`を実行。ここでは$1の中身はDesktopなので、`cd Desktop`となる。
…
…
…

といった具合に、ループしてしまいます。

これを防ぐために、`\cd`という表記をします。
「これはエイリアスではないよ！」ということを明示するための書き方だと考えてください。

長くなってしまったので、まとめると

1. 複数処理をエイリアスにする時は、`function`を使って処理をまとめる
2. エイリアスで追加情報を入力させる時は、functionの中に`$1`などを追加し、追加情報をfunctionの中で処理できるようにする
3. エイリアスとコマンドが同じ場合、処理の中で`\cd`としてコマンドであることを明示しないと無限ループが起こる


## 【オマケ】Railsアプリを新しく作る時、Gem deviseのインストールと管理・ユーザーモデルの構築までを一つのエイリアスで

RubyやRuby on Railsをインストールしている場合、それらのコマンドもエイリアスで使えます。

私はRailsでアプリを開発する時、`devise`というGem(プラグイン)を使ってログイン機能を作ることが多いのですが、本来なら
1. Railsアプリを新しく作って
2. Railsアプリのディレクトリに移動
3. Gemfile(プラグインを記載するファイル)にdeviseを追記して
4. deviseをインストール
5. deviseを使ってAdmin(管理者),User(一般ユーザー)のテーブルを作成
というような、いくつかのステップを踏む必要があります。

面倒なのでまとめたものがこちらになります。
詳しい説明は省きますが、「こんなこともできるんだな〜」程度に見ていただければと思います。

```bash:~/.bashrc
function rails_with_devise(){
  rails new $1;
  cd $1;
  echo "gem 'devise'" >> Gemfile;
  bundle;
  rails g devise User;
  rails g devise Admin;
  rails db:migrate;
}

alias rwd=rails_with_devise
```

# 最後に
いかがだったでしょうか。
ほんの一例しかお伝えできませんでしたが、エイリアスは使いこなせると、作業効率がグンと上がります。
これを機に、自分流のエイリアスを作ってみましょう！

# 参考
[bashとは | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11786.html)
[.bash_profileと.bashrcなんて使い分けなくてよかったんや！](https://qiita.com/dark-space/items/cf25001f89c41341a9fd)
[Linux: .bashrcと.bash_profileの違いを今度こそ理解する](https://techracho.bpsinc.jp/hachi8833/2019_06_06/66396)
[コマンドの先頭にエスケープ文字](https://mkacky.wordpress.com/2013/05/10/コマンドの先頭にエスケープ文字/amp/)