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


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

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

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

fish shellが結構良かった話 - Qiita
全訳!fishシェル普及計画
ログインShellをfishにして作業効率を改善する

サーバー環境

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

手順

git, rbenv, Rubyのインストール

参考: EC2(Amazon Linux2)へRubyのインストールするよ2020 - Qiita

gitのインストール

最初はgitすらない状態からスタートです。

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

rbenvのインストール

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のインストール

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のインストール

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
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ユーザーに切り替えます。

rootユーザーに移動
$ sudo su -

ターミナルのプロンプト(左側に表示されているこういう↓やつ)が

[ec2-user@ip-xxx-xx-xx-xxx ~]$ から
[root@ip-xxx-xx-xx-xxx ~]# に切り替わったと思います。

パスワード設定

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

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:と聞かれるので、もう一度入力して完了。

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

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

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

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

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

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

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

Homebrewをインストール

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

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

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

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

バージョンが表示されたら、インストール成功&PATHが通っているということです。

fishのインストール

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

$ brew install fish

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

$ fish -v

fish, version 3.2.1

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

$ which fish

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

/etc/shellsを編集します

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

デフォルトログインシェルを切り替えるchshコマンドが使えるように、util-linux-userをインストールします。
【AWS】EC2でchshのシェル変更できない問題解決【zsh】

$ sudo yum install util-linux-user -y

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

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

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

$ 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 上で開発する
VSCode Remote SSH接続できない

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

$ fish

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

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

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

テーマを設定する

fishermanのインストール

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

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

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

oh-my-fish/theme-bobthefishをインストール

いろんな記事でオススメされていたので僕も導入してみた oh-my-fish/theme-bobthefish というテーマを入れましょう!

こんな感じ↓↓↓になります

ね!いい感じでしょう!?

$ fisher install oh-my-fish/theme-bobthefish

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

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

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

$ cd fonts

$ ./install.sh

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

プラグインを入れる

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

fish shellが結構良かった話

jethrokuan/z

$ fisher install jethrokuan/z

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

以下は~から$ z foli を叩いて、 /Applications/MAMP/htdocs/folicolleに移動してくれています。

fish shellが結構良かった話によると、

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

folifolicolleディレクトリに行ってくれてかなり助かります。

jethrokuan/fzf

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

$ brew install fzf
$ fisher install jethrokuan/fzf

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

$ vi ~/.config/fish/config.fish

↓この2行を追加

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

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

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

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

もし、


↓この2行を追加

set -U FZF_LEGACY_KEYBINDINGS 0
set -U FZF_REVERSE_ISEARCH_OPTS "--reverse --height=100%"  //--reverseオプション追加

とした場合は、ctr + rで履歴検索モードに入ったとき一番上にコマンド入力欄が出現し、履歴が上から順に並びます。これはお好みで。

参考

git, rbenv, Ruby, Homebrewインストール

rootユーザーへの切り替えやパスワード変更など Linuxコマンド系

fishシェル関係