Bash
Mac
Linux
iTerm2
ターミナル

shellはbashでもかっこいいターミナルを作りたい!!

1 今回の記事でできるものと対象者

  • 見た目(一部加工しています)
    ScreenShot 2018-10-16 23.54.18.png

  • 機能

    • ログイン環境先への.bashrcの持ち出し
    • ログイン環境別による文字色の変化
    • 等倍フォント
    • 常に自分のいるディレクトリが表示される
    • コマンドの結果の間に改行が入る(これ地味に効く)
  • 対象者

    • ローカルでの開発もするけどそれよりサーバーでの作業が多い方
    • 幾星霜のサーバーを渡り歩く人
    • かっこいいターミナル使いたい人!
    • コンソール初心者さん

2 まえがき

もう何番煎じなのかという記事です。
かっこいいターミナル環境を作ろうという記事はたくさんあるのですが、大半が
偉大なる先人「zshこそ至高」
すごい人「zshにすら変えてねぇとかwwww」
イケてる人「bashのまま使っていいのは小学生までだよねwww」
とかいう記事が多いので、あえてbashのままでもカッコイターミナル環境を作ってみよう。
というのが本記事の目的です。

Windows版はこちらへ!!

3 そもそもなぜbashなのか

確かにzshとか(補完とかきくし)とても便利なんですが、ローカル環境で完結しない人はたくさんいると思うんですよ。
(共用・商用サーバーに頻繁に出入りするなど)

そういう環境に自分環境のためにミドルウェア入れたりするとなぁ…
bash前提でサーバー組まれてるとzshで動かすと不具合出たりするしなぁ…

というのがあって、こんな記事をメモがてら書いてみました。
(まぁネタバラシすると、今回.bashrc書き換えてリモートサーバーに持っていくので、あまりに書き換えすぎると結局環境の破壊になるので最低限にとどめましょう…)

4 実装

4.1 iTerm2のインストール・設定

まずここからiTerm2をインストール。
インストールを終えたら設定です。
ここでの設定は主に可読性を上げるために行っていきます。

まず、等倍フォントを入れよう!!
等倍フォントってなぁに?という方はこちら
vimとかで文章書いていて、文字が揃うのはいいことです!
正直フォントは好きなものでいいのですが、おすすめはRictyというフォントです。
インストールはちょっと面倒ですが、こちらを参考にどうぞ。

次に色ですね、色
()や変数などが文字で色分けされるといいですよね。
iTerm2用のカラースーキムは星の数ほど公開されているのですが、おすすめはJapanesque.itermcolorsというカラースキームです。
こちらから導入してください

これでだいぶ、見た目が良くなってきましたね。
でもまだです。
iTerm2の能力を更に引き出すためにもう少し設定をいじります。
iTerm2 > Preferences より、下記設定をいじっていきます。
(主な変更点を記載していきますが、よくわからない方は他の設定項目も画像の通り変更すると、すこーし幸せになれます)

まず、フォント(大きさ)
スクリーンショット 2018-10-16 19.47.36.png
Rictyに変更したところ、フォントがものすごく小さくなったと思うので、自分が見やすい大きさにここで変えてみてください。

続いて背景
スクリーンショット 2018-10-16 19.48.51.png
正直ここは趣味なのですが、背景をうっすら透かせるとシャレオツです。
好みに合わせてTransparencyをいじってください。
ブラーも聞かせておくと、背景がボケてあまり気にならなくなります。
視認性を落とさない程度にどうぞ。

最後に表示カラーの設定
スクリーンショット 2018-10-16 19.49.01.png
なるべくカラフルに表示したいので、設定をお願いします。

おまけに、他の変更部分も出しておきます(見た目にはあまり関係ないです)
スクリーンショット 2018-10-16 19.55.15.png

スクリーンショット 2018-10-16 19.55.28.png

ぽちぽちの設定はこれで終わりです。お疲れ様でした。

4.2 .bashrcの改修

さてさてここが今回の最大の見せ場です。
コンソール上に表示される情報を根本的に変えていきましょう。

早速ですが、~/.bashrcを下記の様に記載してみます。
(先頭が##な行は今回用の説明文なので無視してください)

# .bashrc

# Function part
## 16bitカラーの定義がわかりにくいので再定義(なくてもいいです)
c_red="\e[31m"
c_gre="\e[32m"
c_yel="\e[33m"
c_blu="\e[34m"
c_mag="\e[35m"
c_cya="\e[36m"
c_off="\e[m"

# Source global definitions
## おまじない
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# Aliases
## この他にもよく使うコマンドのエイリアスを追加してもいいです。
alias grep='grep --color'
alias ssh='sshrc'

## Macでしか使えないコマンドはこのif文の中に入れるといいです
if [ "$(uname)" = "Darwin" ]; then
    alias ls='ls -FG'
    alias ll='ls -FGal'
## 逆にMac以外で有効にしたいものはこちらへ
else
    alias ls='ls -F --color=auto'
    alias ll='ls -Fal --color=auto'
fi

## 環境別設定
### 色の設定などは完全に好みです
### ログインした時点で、そのサーバーのhostnameを元に環境を判断し、shellの表示する文字を変更します
### if文の中の-eごとに部分一致の条件を付け加えられます

# 本番環境
if [ `hostname | grep -e "pro" -e "honban"| wc -l | tr -d " "` -eq 1 ] ; then
## 次の行でコンソールでカレントディレクトリの表示、コマンドごとに改行、色の定義を行う。
    PS1="\[\n${c_red}\]\D{%Y/%m/%d} \t \u@\h -> \[${c_yel}\]\n\w -> \n$ \[\e[0m\]"
# 検証環境
elif [ `hostname | grep -e "stg" | wc -l | tr -d " "` -eq 1 ] ; then
    PS1="\[\n${c_gre}\]\D{%Y/%m/%d} \t \u@\h -> \[${c_yel}\]\n\w -> \n$ \[\e[0m\]"
# ローカル環境
elif [ `hostname | grep -e "local" | wc -l | tr -d " "` -eq 1 ] ; then
    PS1="\[\n${c_cya}\]\D{%Y/%m/%d} \t \u@\h -> \[${c_yel}\]\n\w -> \n$ \[\e[0m\]"
# 自己開発用
elif [ `hostname | grep -e "exp" | wc -l | tr -d " "` -eq 1 ] ; then
    PS1="\[\n${c_mag}\]\D{%Y/%m/%d} \t \u@\h -> \[${c_yel}\]\n\w -> \n$ \[\e[0m\]"
else
## どの環境識別条件にも合わなかったら警告文を赤字で出します。
    printf "${c_red}*** It is an undefined environment***\n${c_off}"

書き終わったら
source ~/.bashrc
と打つと、ローカル環境ですぐさま設定が反映されます。
エラーが出た場合は.bashrcを見直してください。

上記の設定の場合、本番環境は赤、検証環境では緑、ローカル環境では青、検証環境では紫など色分けされるようになります。

4.3 .bashrcのサーバーへの持ち出し

さぁ、最後のもう一息です。
せっかくここまで作り込んだ.bashrcですが、普通にSSHしてもそのリモートサーバーには反映されません。
では、ログインするであろう幾星霜のサーバー全てにこのファイルを置くか、という話になります。

だが、めんどくさい

なので、こんな便利なものがあります。
簡単に言うと、SSHしたときにリモート先に鍵と一緒に.bashrcを持っていって反映してくれる便利なやつです。
(このために.bashrcにalias ssh='sshrc'と仕込んであります)

5 あとがき

sshrcをインストール & 設定後、.bashrcが有効(sourceコマンド実施済み or 新たなコンソール)な状態でsshしてみてください。
するとどうでしょうか。
冒頭のようなカラフルというか自分好みの環境がリモートサーバーでも実現ができているかと思います。
それもリモートサーバーの.bashrcも汚さず!

おめでとうございます、お疲れ様でした。
今後もさらなる快適なコンソールライフを目指して、個々の.bashrcを作り込んでみてください。