#️⃣

bashのプロンプト表示形式を設定する方法

2021/10/06に公開

bashのプロンプト文字列

デフォルトのプロンプト文字列は表示が一色で見づらかったり、表示項目を増やしたり減らしたり、目的や自分の好みに合わせてプロンプト表示を変更すると便利です。ここではその設定方法をまとめます。

環境変数PS1

bashのプロンプト文字列は環境変数PS1で設定できます。

設定対象 概要
表示項目(bash) プロンプトに表示する項目(ユーザー名など)をbashのエスケープシーケンスで設定する。設定内容を解釈して実行するのはbash
装飾(端末) プロンプトの文字列の装飾(文字列の色や点滅など)をANSIエスケープコードで設定する。設定内容を解釈して実行するのは端末(エミュレータ)。

たとえば、RHEL8のデフォルトではユーザー名、ホスト名、現在のディレクトリが[]内に表示されています。この設定のPS1echoコマンドで確認すると[\u@\h \W]\$が設定されていることがわかります。PS1を設定するには他の環境変数と同じようにexportコマンドを実行します。

[koichiro@cl01 ~]$ echo $PS1
[\u@\h \W]\$
[koichiro@cl01 ~]$ export PS1="[\u@\h \W]\$ "

これを個別ユーザーの~/.bashrcに書いておけばシェルが立ち上がる度に設定されます。RHEL系で全ユーザーに設定するには/etc/profile.d配下にps1.shのファイル名で書いておきます。(でもユーザー個別のPS1設定が~/.bashrcにあれば、そちらで上書きされます)

自分の設定例

私はユーザー名、ホスト名、ディレクトリをそれぞれ色を分けて表示しています。

Ubuntuなどdebian系とRHEL系(CentOSなど)で書き方などが微妙に違うので両方について書いておきます。

debian系

  • force_color_prompt=yesを有効にします。一般ユーザーはデフォルトで有効になっていますが、rootユーザーはコメントアウトされています。
  • デフォルトのPS1をコメントアウトして、下記2つのどちらかを選んで使います。スクリーンショットなどを取るときにユーザー名とホスト名を表示したくない場合もあるので、その設定も用意し、必要な時以外はコメントアウトしています。
#~/.bashrc
force_color_prompt=yes
...
PS1='${debian_chroot:+($debian_chroot)}\[\e[38;05;74m\]\u\[\e[00m\]@\[\e[38;05;250m\]\h\[\e[00m\]:\[\e[38;05;172m\]\w\[\e[00m\]\$ '
#PS1='${debian_chroot:+($debian_chroot)}\[\e[38;05;172m\]\w\[\e[00m\]\$ '

RHEL系

各ユーザー毎の個別設定と全ユーザー対象のグローバル設定のカスタマイズができます。

#~/.bashrc
#各ユーザー毎の個別設定
export PS1='\[\e[38;05;74m\]\u\[\e[00m\]@\[\e[38;05;250m\]\h\[\e[00m\]:\[\e[38;05;172m\]\w\[\e[00m\]\$ '

#/etc/profile.d/ps1.sh
#全ユーザー対象のグローバル設定のカスタマイズ
export PS1='\[\e[38;05;09m\]\u\[\e[00m\]@\[\e[38;05;250m\]\h\[\e[00m\]:\[\e[38;05;172m\]\w\[\e[00m\]\$ '
#export PS1='\[\e[38;05;09m\]\w\[\e[00m\]\$ '

表示項目 — bashのエスケープシーケンス

プロンプト文字列に表示したい項目はbashのエスケープシーケンス(特殊文字)で指定します。

特殊文字 プロンプト文字列として展開される内容
      \a       ASCIIのベル文字(07)を出力する(ビープ音が鳴る)
\d 曜日 月 日の形式で日付を表示する
\e ASCIIのエスケープ文字(033)を表示する。\033と書いてもちゃんと実行できる
\h ホスト名を表示する
\H ホスト名をFQDNで表示する
\n 改行する(New Line)
\r 復帰する(Carriage Return)
\s シェルの名前を表示する
\t 現在時刻を24時間表記のHH:MM:SSで表示する
\T 現在時刻を12時間表記のHH:MM:SSで表示する
\@ 現在時刻を12時間表記のHH:MM AM/PMで表示する
\u 現在のユーザー名を表示する
\v bashのバージョンを表示する
\V bashのリリースを表示する
\w 現在のディレクトリを絶対パスで表示する
\W 現在のディレクトリを表示する
\! このコマンドの履歴番号を表示する(historyコマンドの番号に一致する)
\# いま受付中のコマンドが、現在のシェルのセッション中に何番目に実行されたコマンドになるか通し番号で表示する
\$ 実効UIDが0(root)の場合に#を表示し、それ以外の場合は$を表示する
\[ 画面に表示しない非表示文字のシーケンスを開始する。これを使って文字の色などの制御シーケンスを埋め込むことができる
\] 非表示文字のシーケンスを終了する

装飾(色の指定など) — ANSIエスケープコード

装飾対象の文字列の直前に\[で始まる非表示文字のシーケンスとして記述し、装飾対象の文字列の直後に\e[0mで装飾効果をリセットし、非表示文字のシーケンスを\]で終了します。

一番下のスクリーンショットに実行例がありますが、たとえば\e[5m\#\$\e[m\] とすると、セッション中のコマンド実行番号と$に下線を引き、$の後ろにスペースを1つ取ります。\e[m\]で装飾効果をリセットしてあるので、ユーザーが入力するコマンドには下線は引かれません。

ANSIエスケープコードにはカーソル位置を上下左右などに動かすCSI (Control Sequence Introducer)とSGR (Select Graphic Rendition)パラメーターがあり、プロンプトの表示を装飾するという意味ではSGRを利用することになります。

コード 名称 概要
\e[0m リセット すべての指定内容を未設定状態に戻す。コード抜きで\e[mと記載すると\e[0mとして扱われる。自分の設定例では分かりやすさを優先して\e[00mとしている
\e[1m ボールド フォントが対応していれば太字になる
\e[2m 薄く表示 フォントが対応していれば字を薄く表示する
\e[3m イタリック フォントが対応していれば太字になる
\e[4m アンダーライン 下線を引く
\e[5m ブリンク 点滅する
\e[6m 高速ブリンク 高速に点滅する(環境依存)
\e[7m リバース 前景色と背景色を入れ替えて表示する
\e[8m コンシール 文字列を隠す(環境依存)
\e[9m クロスアウト 取り消し線(環境依存)
\e[30m 前景色の設定 #000000 ブラック
\e[31m 前景色の設定 #ff0000 レッド
\e[32m 前景色の設定 #00ff00 グリーン
\e[33m 前景色の設定 #ffff00 イエロー
\e[34m 前景色の設定 #0000ff ブルー
\e[35m 前景色の設定 #ff00ff マゼンタ
\e[36m 前景色の設定 #00ffff シアン
\e[37m 前景色の設定 #ffffff ホワイト
\e[38m 前景色の設定 色の拡張指定で引数を2つ取る。05;xのxに0~255のカラーインデックス。2;r;g;bも指定できるが端末が24bitカラー表示に対応している必要がある。自分の設定例では05;xでカラーインデックスを指定している
\e[39m 前景色の設定 デフォルトにリセットする
\e[40m 後景色の設定 #000000 ブラック
\e[41m 後景色の設定 #ff0000 レッド
\e[42m 後景色の設定 #00ff00 グリーン
\e[43m 後景色の設定 #ffff00 イエロー
\e[44m 後景色の設定 #0000ff ブルー
\e[45m 後景色の設定 #ff00ff マゼンタ
\e[46m 後景色の設定 #00ffff シアン
\e[47m 後景色の設定 #ffffff ホワイト
\e[48m 後景色の設定 色の拡張指定で引数を2つ取る。05;xのxに0~255のカラーインデックス。2;r;g;bも指定できるが端末が24bitカラー表示に対応している必要がある。
\e[49m 後景色の設定 デフォルトにリセットする

PS1実行例

[koichiro@cl01 ~]$ export PS1="\a\$ "   #プロンプト表示が$だけになりビープ音が鳴る
$ 
$ export PS1="\d\$ "                    #曜日 月 日の形式で日付を表示する
Mon Oct 04$ 
Mon Oct 04$  export PS1="\e\$ "         #ASCIIのエスケープ文字(033)を表示する
 
 export PS1="\h\$ "                     #ホスト名を表示する
cl01$ 
cl01$ export PS1="\H\$ "                #ホスト名をFQDNで表示する
cl01.hvrmbp.local$ 
cl01.hvrmbp.local$ export PS1="\n\$ "   #改行する

$ 

$ export PS1="\r\$ "                    #復帰する
$ 
$ export PS1="\s\$ "                    #シェルの名前を表示する
-bash$ 
-bash$ export PS1="\t\$ "               #現在時刻を24時間表記のHH:MM:SSで表示する
23:38:47$ 
23:38:48$ export PS1="\T\$ "            #現在時刻を12時間表記のHH:MM:SSで表示する
11:38:51$ 
11:38:52$ export PS1="\@\$ "            #現在時刻を12時間表記のHH:MM AM/PMで表示する
11:40 PM$ 
11:40 PM$ export PS1="\u\$ "            #現在のユーザー名を表示する
koichiro$ 
koichiro$ export PS1="\v\$ "            #bashのバージョンを表示する
4.4$ 
4.4$ export PS1="\V\$ "                 #bashのリリースを表示する
4.4.20$ 
4.4.20$ export PS1="\w\$ "              #現在のディレクトリを絶対パスで表示する($HOMEは~で表示)
~$ cd zenn/
~/zenn$ 
~/zenn$ cd articles/
~/zenn/articles$ 
~/zenn/articles$ cd /sys/class/net
/sys/class/net$ 
/sys/class/net$ export PS1="\W\$ "      #現在のディレクトリを表示する($HOMEは~で表示)
net$ 
net$ cd
~$ 
~$ cd zenn/
zenn$ cd articles/
articles$ 
articles$ cd
~$  
~$ export PS1="\!\$ "                   #このコマンドの履歴番号を表示する(historyコマンドの番号に一致する)
  210  export PS1="\!\$ "
  211  history 
212$ 
213$ export PS1="\#\$ "                 #現在のシェルのセッション中に実行されたコマンド番号を表示する
22$
22$ exit  
logout
Connection to 192.168.70.133 closed.
% ssh cl01.hvrmbp.local
Web console: https://cl01.hvrmbp.local:9090/ or https://192.168.70.133:9090/

Last login: Tue Oct  5 10:08:20 2021 from 192.168.70.1
koichiro@cl01:~$ export PS1="\#\$ "
2$ 
2$ export PS1="\$ "                    #実効UIDが0(root)の場合に#を表示し、それ以外の場合は$を表示する
$ 
$ export PS1="\[\$ "                    #非表示文字のシーケンスを開始する。これを使って文字の色などの制御シーケンスを埋め込むことができる
$ 
export PS1="\[]\$ "                     #非表示文字のシーケンスを終了する
]$ 
export PS1="\$ "
$ export PS1="[\u@\h \W]\$ "            #RHEL8のデフォルト表示に戻す
[koichiro@cl01 ~]$ 

装飾のANSIコードの実行例に関してはスクリーンショットでご覧ください。

参考資料

https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html
https://en.wikipedia.org/wiki/ANSI_escape_code

GitHubで編集を提案

Discussion