手元のUbuntu 16.04のbashは次のような見た目です。
このうちプロンプトに対しては次のような不満があります。
- 大量の出力がある時、始点としてのプロンプトが埋もれる。
- パス部分が長すぎると見にくい。
これらの不満点に対してそれぞれ
- プロンプトに色を付ける。
- パス部分を切り詰める。
ことで対処したいと思います。
現行の設定の確認
プロンプトの見た目は変数PS1
によって制御します。PS1
のデフォルト値は次のとおりでした。
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
末尾の\u@\h:\w\$
がプロンプト表示を制御している部分です。(それ以外の部分\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}
はこの記事では無視します。)
ちなみにここで使われている特殊文字の意味は
-
\u
ユーザ名 -
\h
ホスト名 -
\w
カレントディレクトリ -
\$
実効UIDが0の場合に#
、それ以外の場合は$
となります。その他の特殊文字についてはbashのマニュアルをご覧ください。
以下、これを基にプロンプトを改造していきます。
プロンプトに色を付ける
色を付けたい部分の前に\[\e[x;ym\]
を置きます。x;y
で文字の色・スタイルを定めます。今回は1;32
を使ってみます。これはユーザ入力も含め後続の部分全てに影響しますので、\[\e[m\]
で終端してやる必要があります。
PS1='\[\e[1;32m\]\u@\h:\w\$ \[\e[m\]'
見た目は次のとおりです。
どこが開始地点かわかりやすくなったかと思います。
パス部分を切り詰める
sedを使う
30文字を超えたら前後15文字ずつを残して切り詰め、省略部分を...
で表すことにします。(30~32文字の時、かえって文字数が増えてしまいますがあしからず・・・。)
PS1='\u@\h:$(echo "\w" | sed -e "/^.\{30,\}$/s/^\(.\{15\}\).*\(.\{15\}\)$/\1...\2/")\$ '
ここでクォートの有無や種別は非常に重要です。最外のシングルクォートをダブルクォートで置き換えるとコマンド置換がうまく働きませんし、\w
を囲むダブルクォートが無いと~
が展開されてしまいます。
見た目は次のようになります。
PROMPT_DIRTRIM変数を設定する
bash4.0以上であればPROMPT__DIRTRIM
に整数値を設定して、\w
または\W
が展開された時に表示されるディレクトリの階層数を制御できます。左側が切り詰められます。
user@example:~$ echo $PROMPT_DIRTRIM
2
user@example:~$ cd dev/haskell
user@example:~/dev/haskell$ cd gtk-test/
user@example:~/dev/haskell/gtk-test$ cd .stack-work/
user@example:~/.../gtk-test/.stack-work$ cd install/i386-linux/lts-6.10/7.10.3/bin/
user@example:~/.../7.10.3/bin$ cd /usr/local/share/
user@example:.../local/share$
~
があるかどうかで振舞いが違うような・・・?
参考文献
bashのプロンプトの基本や色の制御については次が参考になります。
Bash prompt basics
Linuxで、bash プロンプトを素敵で実用的なものに変更する
Bash カラープロンプト - ArchWiki