AWS EC2 (Amazon Linux 2) へfishを導入する

最近新しく入った会社での仕事は、「**個人用に割り当てられたEC2インスタンス**」上に開発環境があります。
「EC2上でもローカルで慣れ親しんだ`fish`シェル環境で開発をしたいぞ！！！」と思い、`EC2`内で`fish`環境を構築した備忘録です。

色々方法はあると思いますが、自分が慣れている`Homebrew`を使った`fish`の導入方法をまとめました。

**そもそも`fish`ってどんなヤツなん？使ったらどんないいことあるん？**ってのは、他の記事にたくさんまとまっているので、そちらを参考にしてください！

[fish shellが結構良かった話 - Qiita](https://qiita.com/hennin/items/33758226a0de8c963ddf)
[全訳！fishシェル普及計画](http://fish.rubikitch.com/)
[ログインShellをfishにして作業効率を改善する](https://www.aizulab.com/blog/fish-shell/)

# サーバー環境

- EC2インスタンス
- Amazon Linux2
- t2.micro

# 手順

## git, rbenv, Rubyのインストール
参考： [EC2（Amazon Linux2）へRubyのインストールするよ2020 - Qiita](https://qiita.com/Ekodhikodhi/items/01eab1b2b5785163e684)

### gitのインストール
最初は`git`すらない状態からスタートです。

```bash:gitのインストール
$ sudo yum install git -y
```

### rbenvのインストール
```bash:rbenvをリポジトリからクローンし、PATHを通す
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

$ source ~/.bash_profile

$ rbenv -v
// rbenvのバージョンが表示されればインストール正常にインストール完了
```

### ruby-buildのインストール

```bash:ruby-build（rbenvを使ってRubyをインストールするために必要なrbenvのプラグイン）のインストール
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh

$ rbenv install -l
// インストール可能なRubyのバージョン一覧が表示されればruby-buildのインストールは成功
```

### Rubyのインストール

```bash:Rubyインストールに必要なパッケージをインストール
$ sudo yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
```
```bash:Rubyをインストール
$ rbenv install 2.7.2 //めっちゃ時間かかりますので気長に待ちます

$ rbenv global 2.7.2

$ ruby -v
```

## Homebrewのインストール と ユーザーのパスワード設定
`fish`をインストールするためのパッケージマネージャー`Homebrew`をインストールしようとすると、ユーザー（ここでは`ec2-user`）のパスワード入力を求められます。初期設定ではパスワードの設定をしていないので、まずは`ec2-user`のパスワードを設定してあげます。

### rootユーザーへ切り替え
パスワードの変更は`root`ユーザーのみ許されているので、まずは`ec2-user`から`root`ユーザーに切り替えます。

```bash:rootユーザーに移動
$ sudo su -
```
ターミナルの**プロンプト**（左側に表示されているこういう↓やつ）が
![スクリーンショット 2021-04-06 9.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407378/f4b931db-7afa-4bd5-7eaf-240a0e065a68.png)
`[ec2-user@ip-xxx-xx-xx-xxx ~]$` から
`[root@ip-xxx-xx-xx-xxx ~]#` に切り替わったと思います。

### パスワード設定
では、`ec2-user`のパスワードを設定します。

```bash:ec2-userのパスワード設定
$ passwd ec2-user

Changing password for user ec2-user.
New password: //設定したいパスワードを入力します
```

`$ passwd ec2-user`を叩くと、`Changing password for user ec2-user.`というメッセージとともに`New password:`を聞かれます。設定したいパスワードを入力しましょう。

次に`Retype new password:`と聞かれるので、もう一度入力して完了。

```bash:ec2-userのパスワード設定
$ passwd ec2-user

Changing password for user ec2-user.
New password: //設定したいパスワードを入力します

Retype new password: //確認の為再度入力します

passwd: all authentication tokens updated successfully. //これでパスワードの設定完了です
```

忘れないように、ec2-userへ切り替えます。

```bash:rootユーザーからec2-userへ切り替え
$ sudo su - ec2-user

$ source ~/.bash_profile //ユーザーを切り替えたので、再度.bash_profileを読み込んであげます
```

### Homebrewをインストール

ではHomebrewをインストールします。パスワードを聞かれたら先ほど設定したパスワードを入力します。

```bash:Homebrewをインストール
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

インストールしたら、PATHを通してあげます。

```bash:PATHを通してあげる
$ echo 'export PATH=/home/linuxbrew/.linuxbrew/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```

```bash
$ brew -v
```
バージョンが表示されたら、インストール成功＆PATHが通っているということです。

## fishのインストール

ではいよいよ、`Homebrew`を使って`fish`をインストールします。

```bash
$ brew install fish
```

インストール後は、`fish`コマンドが使えるようになります。

```bash
$ fish -v

fish, version 3.2.1
```

ログインシェルに`fish`を設定するため、`/etc/shells`にパスを追加します。
まずは、`fish`がある場所（フルパス）を確認

```bash
$ which fish

/home/linuxbrew/.linuxbrew/bin/fish  //このフルパスをあとで追記する
```

`/etc/shells`を編集します

```bash
$ sudo vi /etc/shells
```
```bash
・
・
・
/bin/tcsh                                                                                            
/bin/csh
/home/linuxbrew/.linuxbrew/bin/fish　　//この１行を追加
```

デフォルトログインシェルを切り替える`chsh`コマンドが使えるように、`util-linux-user`をインストールします。
[【AWS】EC2でchshのシェル変更できない問題解決【zsh】](https://suwaru.tokyo/%E3%80%90aws%E3%80%91ec2%E3%81%A7chsh%E3%81%AE%E3%82%B7%E3%82%A7%E3%83%AB%E5%A4%89%E6%9B%B4%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%80%90zsh%E3%80%91/)

```bash
$ sudo yum install util-linux-user -y
```

デフォルトログインシェルをfishに変えてあげます。またパスワードを聞かれるので、入力します。

```bash
$ chsh -s /home/linuxbrew/.linuxbrew/bin/fish
```

一度`$ exit`で`ssh`を抜けて再度`ssh`ログインしてみて、

```bash
$ echo $SHELL

/home/linuxbrew/.linuxbrew/bin/fish //fishに変わっている
```

`$ echo $SHELL`した結果が`/home/linuxbrew/.linuxbrew/bin/fish`に変わっていたら成功です。（プロンプトが変わっているので見た目でも違いが分かると思います！）

## （補足）VSCodeのRemote SSHが使えない！？

ちなみにですが、僕は今回`fish`を導入したEC2上にプロジェクトのソースコードがあり、VSCodeの`Remote SSH`機能を使ってVSCode上でソースの編集を行っているのですが、なんとデフォルトシェルを`fish`にした状態では`Remote SSH`で接続できないことがわかりました。

[VSCode の Remote - SSH 機能を使って EC2 上で開発する](https://blog.serverworks.co.jp/tech/2020/02/20/vscode-remote-ssh/)
[VSCode Remote SSH接続できない](https://qiita.com/y-mattun/items/3af358ba784c6af56c0c)

なので、僕はデフォルトログインシェルは`bash`のままで、`ssh`ログイン後に

```bash
$ fish
```
を叩いて`fish`に切り替えています。この辺は各々の作業環境に合わせて良き方を選んでください。

## （番外編）ちょっとだけカスタマイズして良い感じにする

ここまででfishのインストールが完了したので記事としてはもう終わりでも良いのですが、せっかくなので少しだけカスタマイズしてさらに使いやすくしちゃいます！

### テーマを設定する

#### `fisherman`のインストール

まずは、`fisherman`という`fish`用のパッケージマネージャーをインストールします。

```bash
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisher

$ fisher -v  //バージョンが表示されたらインストール成功です
```

#### `oh-my-fish/theme-bobthefish`をインストール
いろんな記事でオススメされていたので僕も導入してみた [oh-my-fish/theme-bobthefish](https://github.com/oh-my-fish/theme-bobthefish) というテーマを入れましょう！

こんな感じ↓↓↓になります
![f16f6b2c-6c35-11e6-8eb9-9f23ea3cce2e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407378/642806e5-e003-6af3-c57c-5cc6fb46f6f9.gif)
**ね！いい感じでしょう！？**



```bash
$ fisher install oh-my-fish/theme-bobthefish
```
※ちなみに、パッケージ追加用の`install`コマンドは、`fisher`のバージョンが古いやつだと`add`だった時代もあるので、エラーが出た場合は`add`で試してみてください。`fish`関連の記事を調べてヒットするのは`add`コマンドを紹介したものが多いです。

`oh-my-fish/theme-bobthefish`のインストールが完了しましたが、多くのテーマでは`Power fonts`というフォントを入れないと文字化けしてしまうので、入れてあげます。

```bash
$ git clone https://github.com/powerline/fonts.git --depth=1

$ cd fonts

$ ./install.sh
```

ターミナルのアプリが`iterm2`だったら、`Preferences` > `Profiles` > `Text` > `Change Font`から、好きなフォントを選んでください。

![スクリーンショット 2021-04-07 22.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407378/4ec56d17-f8f5-411e-bb71-6057e6a143a0.png)


### プラグインを入れる

僕も`fish`使い始めてまだ数ヶ月で全然使いこなせているわけではありませんが、オススメプラグインを2つほど紹介します。

[fish shellが結構良かった話](https://qiita.com/hennin/items/33758226a0de8c963ddf)

#### [jethrokuan/z](https://github.com/jethrokuan/z)

```bash
$ fisher install jethrokuan/z
```

華麗にディレクトリ移動してくれるプラグインです。**すべてのディレクトリへ直接移動**することができます。

以下は`~`から`$ z foli` を叩いて、 `/Applications/MAMP/htdocs/folicolle`に移動してくれています。
![スクリーンショット 2021-04-07 22.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407378/34b4d46a-91d9-11e8-306b-c85e7c1d33b7.png)

[fish shellが結構良かった話](https://qiita.com/hennin/items/33758226a0de8c963ddf)によると、

原理としては**コマンドの履歴のパスから指定された相対パスに部分一致するパスを検索**しているそう。**行ったことあるディレクトリにしか**行けないです。

`foli`で`folicolle`ディレクトリに行ってくれてかなり助かります。

#### [jethrokuan/fzf](https://github.com/jethrokuan/fzf)

`fzf`は`ctl + r`を使ったコマンドの履歴絞り込みができるツールです。**こいつはマジで使えます。**

```bash
$ brew install fzf
$ fisher install jethrokuan/fzf
```

また、`~/.config/fish/config.fish`というファイルを作って、下記の設定を追加します。

```bash
$ vi ~/.config/fish/config.fish
```

```bash

↓この２行を追加

set -U FZF_LEGACY_KEYBINDINGS 0
set -U FZF_REVERSE_ISEARCH_OPTS "--height=100%"
```

`FZF_LEGACY_KEYBINDINGS`は`fish`の過去バージョンとコンフリクトが発生していたため、新しいキーバインドを使用するのに必要です。

`FZF_REVERSE_ISEARCH_OPTS`は履歴のフィルタリング時に入力欄をフルスクリーンで表示するための`–height`オプションを設定しています。

これで、`ctl + r`で快適にコマンド履歴を検索できるようになり、素敵なターミナルライフを送れることでしょう！！！

もし、

```bash

↓この２行を追加

set -U FZF_LEGACY_KEYBINDINGS 0
set -U FZF_REVERSE_ISEARCH_OPTS "--reverse --height=100%"  //--reverseオプション追加
```
とした場合は、`ctr + r`で履歴検索モードに入ったとき一番上にコマンド入力欄が出現し、履歴が上から順に並びます。これはお好みで。

# 参考

### git, rbenv, Ruby, Homebrewインストール
- [EC2（Amazon Linux2）へRubyのインストールするよ2020 - Qiita](https://qiita.com/Ekodhikodhi/items/01eab1b2b5785163e684)
- [AWSでhomebrew - Qiita](https://qiita.com/Ekodhikodhi/items/01eab1b2b5785163e684)

### rootユーザーへの切り替えやパスワード変更など Linuxコマンド系
- [【 passwd 】コマンド――パスワードを変更する - @IT](https://www.atmarkit.co.jp/ait/articles/1612/05/news021.html)
- [【su】Linuxでユーザーを切り替えるコマンド - UX MILK](https://uxmilk.jp/52356)
- [【 su 】コマンド――スーパーユーザー（rootユーザー）の権限でシェルを実行する - @IT](https://www.atmarkit.co.jp/ait/articles/1611/24/news028.html)
- [【AWS】EC2でchshのシェル変更できない問題解決【zsh】](https://suwaru.tokyo/%E3%80%90aws%E3%80%91ec2%E3%81%A7chsh%E3%81%AE%E3%82%B7%E3%82%A7%E3%83%AB%E5%A4%89%E6%9B%B4%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%80%90zsh%E3%80%91/)

### fishシェル関係
- [【初学者殺し】fishシェルでPATHを通してみる - Qiita](https://qiita.com/kiwatchi1991/items/6962dfa645bf6e66f85e)
- [【初心者向け】fish shellの入れ方と、rbenvではまっている話 - Zeals.TechBlog](https://tech.zeals.co.jp/entry/2019/04/11/150848)
- [【Mac】fish + fisher + peco + fzfで快適なターミナル環境を構築 - Public Constructor](https://public-constructor.com/terminal-fish-setup/#toc9)
- [fish shellが結構良かった話 - Qiita](https://qiita.com/hennin/items/33758226a0de8c963ddf)
- [全訳！fishシェル普及計画](http://fish.rubikitch.com/)
- [ログインShellをfishにして作業効率を改善する](https://www.aizulab.com/blog/fish-shell/)