最近色々.bashrc
だとか整理している時に、プロンプトの表示を変更しようと思い、
結局何が必要なのか考えたのですが、
普通、ディレクトリ名やユーザー名、ホスト名などを入れていると思いますが、
普段はGNU screenを使っていて、
常に各領域にディレクトリパスも表示させてるので、プロンプトに情報を表示
させとく必要が特に無いわけです。
そこで、プロンプト表示でちょっと遊んでみました。
これまでのプロンプト
ここではbash
での話です。
プロンプトはPS1
というシェル変数を変更してやることで表示を変えてやることが出来ます。
手元の環境だと、デフォルトでは/etc/bashrc
内で次のように設定されています。
# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
return
fi
PS1='\h:\W \u\$ '
\h
がホスト名、\W
がカレントディレクトリ、\u
でユーザー名です(他のオプションはman bash
)。
従って、ホームディレクトリで操作していると
hostname:~ username$
の様な表示になるはずです。
これまで自分の設定ではPS1="[\h \W]\$ "
と.bashrc
で指定してました。
[hostname ~]$
的な感じでした。
顔文字にしてみる
単純に変更するだけなら
hostname:~ user$ PS1='(-_-) \$ '
(-_-) $
(-_-) $
こんなかんじで、以後ずっと(-_-)
になります。
これだけだと味気ないので直前のコマンドが実行がエラー(0以外)を吐いたときは 違う表示をさせてやりたいと思います。
(-_-) $ PS1="\$(\
> ret=\$?
> if [ \$ret -eq 0 ];then\
> printf '\[\e[m\](^_^)\[\e[m\] \$ ';\
> else\
> printf '\[\e[31m\](@o@)\[\e[m\] \$ ';\
> fi;\
> )"
(^_^) $ echo
(^_^) $ eeeeee
bash: eeeeee: command not found
(@o@) $
(@o@) $ echo
(^_^) $
(^_^) $
$()
を使ってPS1
の設定の中にコマンドを持ち込んでいます。
$?
で直前のコマンドの返り値を見て、0
なら(^_^)
、それ以外なら(@o@)
を赤で表示させています。
何も入力しないでEnter
した場合は前の状態が残るので直前と同じ顔が出ます。
顔文字の両側にある\[e[31m]
などが色を変更している部分です。
後ろの\[\e[m\]
の部分は設定をリセットしています。
書く数字でどのように表示されるかは
escseqcheck.sh
というスクリプトもあるので参考にしてみて下さい。
(ちょっとした自分用の説明もファイル内に書いてあります。)
ランダムに顔を変えてみる
上記の前コマンドの返り値に加えて、乱数で条件分岐させてやることで 毎回違った顔を楽しめるようにしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
こんな感じの設定で毎回違った顔が楽しめるようになります。
$RANDOM
は参照するたびに0-32767までのランダムな整数を返します。
bash
では一番簡単な乱数の取得だと思うので、今回はこれを使いました。
後は、36パターンの状態を作りだして、適当な割合で
各顔文字に割り当てているだけです。
こんな感じになります。