oinume journal

Scratchpad of what I learned

zshをやめてbashにした

TL;DR

  • Bashを使うにあたって、zshが持つ標準機能のレベルと同じにするには初期設定が面倒だったけどなんとかいける。Bashは進化していると感じた。
  • bash-itが便利
  • 設定は .bash_profile も含めてoinume/dotfilesに上げているので参考にどうぞ

動機

ターミナル環境を見直す(1) - zsh + prezto編 - oinume journal の記事でデフォルトのshellをzshに切り替えたけど、tmuxでバンバン新しいタブを開くと起動の遅さが気になっていてそろそろどうにかしたいと思っていた。また、zshは便利だけど設定項目を覚えたり調べるのが大変だし、ほとんどの機能は使いこなせていなかったので、これを機にシンプルなbashに乗り換えてみた。この記事はその際にやったことのメモ。

以下によると次期macOS Catalinaではbashに代わってzshがデフォルトになるらしく、時代と逆行していて面白い。

support.apple.com

macOS mojaveに最新のbashをインストール

maxOS mojaveのデフォルトのbashは3.2.57と古いので、まずは最新のbashをhomebrewでインストールする。

$ brew install bash

chshでログインシェルを変更

brewでインストールしたbashは /usr/local/bin/bash にあるので、これをログインシェルとして変更する。

$ chsh -s /usr/local/bin/bash
(パスワードを聞かれる)
chsh: /usr/local/bin/bash: non-standard shell

しかし、↑のようなエラーになってしまうので、 sudo vi /etc/shells して /usr/local/bin/bash を追記してもう一度 chsh コマンドで変更する。

$ chsh -s /usr/local/bin/bash

Prompt

やはり素のプロンプトだと味気ないので、Prompt関連はけっこう設定をいじった。以下に詳細を書く。

Powerline

定番のPowerline。bash-powerlineというものがあったので、これを以下のように少しカスタマイズして使っている。(Macの場合プロンプトの記号が$ではなくになるのがどうしても嫌だった)

export PS_SYMBOL='$'
[ -f ~/dotfiles/bash-powerline.sh ] && . ~/dotfiles/bash-powerline.sh

カレントディレクトリの表示

デフォルトだとカレントディレクトリだけがプロンプトに表示されて、同じディレクトリが複数あるとどこにいるのかわからなくなる問題がある。zshだと ~/go/src/github.com/oinume/playground-go にいる場合は ~/g/s/g/o/playground-go のようにいい感じに省略してくれるので似たようなことがやりたかった。調べたところ、bashでもPROMPT_DIRTRIMという環境変数で似たようなことができる。PROMPT_DIRTRIM=2 にした場合は ~/.../oinume/playground-go のようになる。一つ上のディレクトリ名がわかれば良いと思ったので、自分としてはこれで満足している。

コマンド履歴のターミナル間での共有

zshでは当たり前にできるやつ。以下を .bash_profile に追加すればOK。

function share_history {
    history -a
    history -c
    history -r
}

PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=2000

過去に移動したディレクトリの検索

Bash の小枝集のcdhist.sh + fzf で検索できるようにしている。.bash_profileでの設定は以下のようになっていて、Ctrl+@で呼び出せるようにしている。

[ -f ~/dotfiles/cdhist.sh ] && . ~/dotfiles/cdhist.sh

_cd_cdhist() {
  cd "$(for i in "${CDHIST_CDQ[@]}"; do echo $i; done | fzf)"
}

bind -x '"\C-@": _cd_cdhist';

bash-it

様々なalias、補完、プラグインが用意されているbash-itというものを使ってみる。

以下のようにインストールする。

$ git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it
$ ~/.bash-it/install.sh

補完やプラグインを有効にする

$ bash-it enable completion bash-it
$ bash-it enable plugin xyz

上記のコマンドを実行すると、~/.bash-it/enabled にsymlinkが作成される。以下のコマンドで alias, completion, pluginの一覧を見ることができるので、自分が使いそうなものを有効にしていくと良い。

bash-it show aliases
bash-it show completions
bash-it show plugins

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)