bash,zshのプロンプトをカスタマイズする

調べたのでメモ

bashのプロンプトをカスタマイズするためには普通に .bashrcとかで PS1='✖╹◡╹✖'とかやればよいんだけど、たとえばここに今使ってるrubyのversionとか現在の時刻とか出したいみたいなことありますよね? そういうときは、たとえばこういうことをするとできる

PS1='$(date)'

あるいは

PS1='`date`'

``で囲んだコマンドとか$()で囲んだコマンドは、プロンプトが表示される度に実行され、ちゃんと毎回最新の情報がプロンプトに表示される。ただし、このとき右辺をシングルクオートで囲むことに注意。ダブルクオートで囲むと、(当然だが)PS1への代入時にコマンドが評価され、PS1にはその結果の文字列が代入されるため、たとえばdateだったらログインしたときの値がずっと表示され続けてしまうので注意。

一方、zshの場合は毎回コマンドを実行させようとPS1='$(command)'と代入しても、プロンプトが表示される度に毎回このコマンドが呼ばれるわけではなく、$(command)という文字列がプロンプトに表示されてしまう(個人的にはこっちのほうが理にかなっている気がする)。

これを避けるには以下のようにする

precmd () {
    psvar=()
    psvar[1]=$(date +'%m/%d %H:%M:%S');
    psvar[2]=$(ruby -e 'puts RUBY_VERSION');
}
PS1='%1v %2v'

precmdという関数がコマンドの前に毎回呼ばれるので、そこでコマンドを実行し、その結果をpsvarという配列に保存しておく。で、PS1ではその配列の要素を %1v とか %2vみたいな感じで取り出して表示する。

ちゃんと調べたわけじゃないのでアレですが、とりあえずわたしの環境ではこれで問題なく動いてる。突っ込み歓迎です。