rcmdnk's blog

20130318_prompt-screen_200_200

最近色々.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 というスクリプトもあるので参考にしてみて下さい。 (ちょっとした自分用の説明もファイル内に書いてあります。)

ランダムに顔を変えてみる

上記の前コマンドの返り値に加えて、乱数で条件分岐させてやることで 毎回違った顔を楽しめるようにしてみます。

face_mark_PS1.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
PS1="\$(\
  ret=\$?
  rand=\$((RANDOM%36));\
  if [ \$ret -eq 0 ];then\
    if [ \$rand -lt 3 ];then
      printf '\[\e[m\](^_^)\[\e[m\] \$ ';\
    elif [ \$rand -lt 5 ];then\
      printf '\[\e[m\](^_-)\[\e[m\] \$ ';\
    elif [ \$rand -lt 6 ];then\
      printf '\[\e[m\](.^.)\[\e[m\] \$ ';\
    else\
      printf '\[\e[m\](-_-)\[\e[m\] \$ ';\
    fi;\
  else\
    if [ \$rand -lt 6 ];then\
      printf '\[\e[31m\](@o@)\[\e[m\] \$ ';\
    elif [ \$rand -lt 12 ];then\
      printf '\[\e[31;1m\](>_<)\[\e[m\] \$ ';\
    elif [ \$rand -lt 18 ];then\
      printf '\[\e[35m\](*_*)\[\e[m\] \$ ';\
    elif [ \$rand -lt 24 ];then\
      printf '\[\e[34m\](T_T)\[\e[m\] \$ ';\
    elif [ \$rand -eq 30 ];then\
      printf '\[\e[34;1m\](/_T)\[\e[m\] \$ ';\
    else\
      printf '\[\e[31m\](>_<)\[\e[m\] \$ ';\
    fi\
  fi;\
  )"

こんな感じの設定で毎回違った顔が楽しめるようになります。 $RANDOMは参照するたびに0-32767までのランダムな整数を返します。 bashでは一番簡単な乱数の取得だと思うので、今回はこれを使いました。 後は、36パターンの状態を作りだして、適当な割合で 各顔文字に割り当てているだけです。

こんな感じになります。

Ref.: 8 Useful and Interesting Bash Prompts

Sponsored Links
Sponsored Links

« Vim以外でVimする: Windows編 PS1とPROMPT_COMMAND, GNU screenでの活用も »

}