aliasと関数で幸せになろう

# はじめに
**みなさんターミナル使ってますか？**
エンジニアになると真っ黒な画面で[マトリックス](https://www.imdb.com/title/tt0133093/)みたいに、コマンドをカタカタ打ってハッカーっぽい行為を毎日のようにするかと思います。
特に、プログラミング初心者の人は教材やスクールで「_ターミナル開いて_」って言われると、「**またかよ、何が悲しくて真っ黒い画面と話さなくちゃなんないんだよ**」って気持ちになる人も多いと思います。

**僕もそうでした**

しかしながら、ターミナルでの操作はめちゃくちゃ便利だし、sshとかでリモートサーバーに接続した際は必須のスキルになるので、せめて、**aliasや関数を登録してコマンド入力を楽にしましょう**

[キズナアイ](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%82%BA%E3%83%8A%E3%82%A2%E3%82%A4)のような対話型AIが実装されるその日まで、alaisと関数を使って快適なターミナルライフを実現しましょう。

因みに、オススメの設定は [aliasと関数で幸せになろう(実践編)](https://qiita.com/belion_freee/items/caa274cd6f642ea464bf) にまとめました。是非使ってみてください。

# そもそもなんやねん？
そもそもaliasと関数てなんなのっていう説明と使い方をざっくり説明します。
因みに、これから参照してるコマンド例は全てターミナル上で実行してるので、ターミナルを事前に立ち上げてコマンドを打って動作を確認してみてくださいね。

## alias
実はaliasもコマンドです。
aliasコマンドはコマンドを別名で登録または、登録されている内容を確認するLinuxコマンドのことです。

例えば、下記のように使えます。

```
% hoge
zsh: command not found: hoge
% alias hoge='echo "This is alias hoge"'
% hoge
This is alias hoge
% 
```
順番に説明すると

- `hoge`と打っても`hoge` なんてコマンドはないぜ！って怒られる
- aliasコマンドを使って`hoge`を登録
- `hoge`がコマンドのように使えるようになる

要するに**aliasはショートカット**みたいなものです。
`alias <ショートカット名>='<実行したいコマンド>'`　で登録できます。

## 関数
bash関数とかとも言われたりします。
その名の通り**シェルスクリプトで書かれた関数のこと**です。

例えば、下記のように使えます。

```
% hoge
zsh: command not found: hoge
% hoge() {
function> echo "This is function hoge"
function> }
% hoge
This is function hoge
% 
```

順番に説明すると

- `hoge`と打っても`hoge` なんてコマンドはないぜ！って怒られる
- `hoge`という名前の関数を定義する
- `hoge`を呼び出せるようになる

はい、このように使い方や機能はaliasと似たようなものです。
では、どのような点が違うのかを次の項目で説明します。

# aliasと関数の使い分け
aliasと関数の使い方について分かったところで、じゃあ、どのようにして使い分けるのかを簡単に説明します。

ただ、明確にこうであるべきって事はないですし、あくまで個人用なのでお好きな方を使う感じで大丈夫ですよ。

## aliasを使うべき時
aliasを使うときは主に`単純な処理`や`コマンドの上書き`をする時です。

例えば環境変数に設定されてる`PATH`を観たい時とかは単純なコマンドですみますよね。

```
% path
zsh: command not found: path
% alias path='echo $PATH'
% path
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

`コマンドの上書き`をする場合です。

```
% ls
Applications  Desktop
% alias ls='ls -l'
% ls
total 324
drwx------@   3 me  staff      96  3 13  2018 Applications
drwx------+   7 me  staff     224  9  7 17:45 Desktop
```


個人的には既存のコマンドを破壊的に変える後者のaliasの使い方はあまり好きじゃないので、前者の使い方がほとんどです。

## 関数を使うべき時
対して関数を使うときは主に`複雑な処理`や`引数を使う処理`をする時です。
特に、aliasは引数を使う事はできないので、**引数を使うのであれば関数一択**です。

`複雑な処理`だとアバウトな言い方ですが、個人的には**1行以上であれば関数にするべき**だと思います。

`引数を使う処理`とは下記のような処理のことです。なお、シェルスクリプトの細かい書き方については割愛します。半端ないボリュームになるので。。。

```
% hoge() {
function> case $1 in
function case> "s") echo "You choose s" ;;          
function case> "m") echo "You choose m" ;; 
function case> *) echo "You are normal" ;;                   
function case> esac
function> }
% hoge s
You choose s
```

簡単に説明すると、`$1`には関数に渡した引数が格納されています。今回だと`s`ですね。この第一引数で与えられたパラメータに応じてCASE式で実行処理を分けてます。

なんとなく予想できたかと思いますが、引数を使える関数の機能がかなり便利なので、よく使う一連の処理を関数で定義しておくと、**ターミナル操作が格段に楽になります**。

# 実際の使い方
さてさて、aliasと関数について単体での使い方について説明してきましたが、いちいちターミナルを起動した時にaliasを登録したり、関数を定義したりするのは現実的じゃないですよね。

そこで、こういった処理はホームディレクトリ直下の`.bashrc`や`.zshrc`に書いちゃいましょう。

そうすればターミナル起動したら**自動で読み込んで使えるようにしてくれます**。

ただし、既にログイン済みで`.bashrc`を書き換えた場合は、必ず`source ~/.bashrc`を実行して読み込んでください。そうしないと追加したaliasなどが反映されません。

## 書き方
`.bashrc`などに直接書けば大丈夫です。こんな感じで。

```
%cat ~/.bashrc
# alias
alias ll='ls -al'
alias d='docker'
alias dc='docker-compose'

# function
ssk() {
 if [ -e ~/tmp/sshuttle.pid ]; then
  echo "kill sshuttle.pid"
  kill `cat ~/tmp/sshuttle.pid`
 fi
}

gre() {
 grep -E $1 -rl $2
}
```

## どのファイルに書けばいい？
実はこのようなファイルって地味に多くてどのファイルに書けばいいか分からないと思います。
ざっくり下記のような使い分けがされているので参考にしてみてください。

因みに、使ってるシェルの種類によって微妙に違うので`echo $SHELL`を実行して自分が使ってるシェルを事前に確認しておいてください。
私の場合はzshを使ってるので以下の出力になります。

```
% echo $SHELL
/bin/zsh
```

### bashの場合
いくつかファイルがありますが、ざっくりと以下のように使い分けられています。
結論から言うと**`~/.bashrc`に記述すれば良い**です。

- `~/.bash_profile` : シェルへのログイン時に存在していれば読込まれる設定ファイル。ログイン時に一度実行されれば良い処理を書くので、環境変数を定義する`export`処理とかを記述。
- `~/.bashrc` : シェルを起動するたびに読み込まれる設定ファイル。基本的にはこのファイルに書けばいい。
- `~/.bash_logout` : シェルからのログアウト時に毎回読込まれる設定ファイル。ログアウトする時に実行したい処理はこちらに記述する。

### zshの場合
ファイル名以外は殆どbashと同じなので書く意味ないかも。
結論から言うと**`~/.zshrc`に記述すれば良い**です。

- `~/.zprofile` : シェルへのログイン時に存在していれば読込まれる設定ファイル。ログイン時に一度実行されれば良い処理を書くので、環境変数を定義する`export`処理とかを記述。
- `~/.zshrc` : シェルを起動するたびに読み込まれる設定ファイル。基本的にはこのファイルに書けばいい。
- `~/.zlogout` : シェルからのログアウト時に毎回読込まれる設定ファイル。ログアウトする時に実行したい処理はこちらに記述する。

# オススメの設定
[aliasと関数で幸せになろう(実践編)](https://qiita.com/belion_freee/items/caa274cd6f642ea464bf) でまとめました。
個人的に有用だと思う設定をまとめてGistに挙げておいたので、コピって使ってみてください。

# まとめ
いかがだったでしょうか？
今まで苦手だったターミナルで、ゴニョゴニョ遊んでみたくなってきたかと思います。

最初は面倒臭いしわけ分からないですが、とにかくコマンドを打ったりこういった便利な機能を試していくことで、必ず使いこなせるようになってきます。

**全ては自分が楽をするため**と思って、あなたの考える最強の`.bashrc`を完成させてください。