🌈

Bashのプロンプトをカスタマイズする【色変・時間表示】

commits4 min read

結果


上半分がデフォルト、下半分が変更したものです。え、そんなに変わってない?まあこれ読んで自分好みにアレンジしてくださいな。

Windows Terminalを使用していますが、色表示対応のターミナルなら他のものでも大丈夫なはずです。配色テーマはOne Half Darkを適用しています。

やり方

ホームディレクトリにある.bashrcの一部を次のように書き換えました。(コメントアウトするかバックアップを取ったほうが良さそうです)

.bashrc
    if [ "$color_prompt" = yes ]; then
-       PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+       PS1='\e[32m\u@\h \e[35m\t \e[34m\w \e[0m\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    fi

どうしてこの見た目になるの?

環境変数PS1を覗く

現在のプロンプト設定は環境変数のPS1に格納されています。

$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

なんじゃこりゃ… 調べてまとめてみた図がこちらです。

前半部分は通常プロンプト部には表示されません。
debian_chrootのあたりはchrootコマンドでルートディレクトリを変更した時に表示されるみたいです。詳しくはこちらを参考にしてください。

https://askubuntu.com/questions/372849/what-does-debian-chrootdebian-chroot-do-in-my-terminal-prompt

PSPrompt Stringの略です。本当はPS2PS3PS4もあるようです。PS2は複数行のコマンドを入力する時にお目にかかります。

PS1詳解

後半のわちゃわちゃした部分を解説します。

まずこの2つを押さえた上で先ほどの後半部を見てみます。

  • \[...\]: この2つに囲われた部分は非表示文字となる
  • \033[...m: 文字表示の仕方を...の部分に指定する

    見やすく色をつけました。登場する特殊文字の意味は以下になります。
特殊文字 意味
\u ユーザー名
\h ホスト名
\w カレントディレクトリ(絶対パス)
\$ $マーク(rootの時は#)

詳しくは以下から

https://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html

PS1簡略化

次にこの3つを踏まえて簡略化します。

  • \[...\]: これはなくても問題ない
  • 00,01: 0,1に等しい
  • \033: \eに等しい。033は8進数。ASCIIではESCを表す

    だいぶ見やすくなりました。

\e[...mを理解する

...の部分に数字を指定することで文字のスタイルを制御できます。制御の一覧はこちらに詳しく載っています。この文字装飾はプロンプトに限らず使えます。

\e[1;32m\e[1m\e[32m を組み合わせたものです。ただし私の環境では太字の設定は適用されませんでした。

装飾方法 意味 見え方
\e[1;32m 太字 & 緑
\e[1;34m 太字 & 青
\e[43m 背景茶
\e[36;45m シアン & 背景マゼンダ
\e[0m 装飾をリセット -

自分用にカスタマイズ

プロンプトに現在時刻を表示させたかったので特殊文字\tを追加しました。

特殊文字 意味
\t 24時間表記の現在時刻

コロンを消し、スペースを追加した最終的な私の設定がこちらです。色は適当です。

PS1='\e[32m\u@\h \e[35m\t \e[34m\w \e[0m\$ '

これを記事冒頭のように.bashrcに挿入し、ターミナルを新しく開けば反映されます。

(おまけ)プロンプトで改行したい

画像のようにプロンプト二行に分けて、入力部の幅を広くしたい!って方もいるんじゃないでしょうか。

そんなときは改行を使いましょう。改行は特殊文字\nでできます。

特殊文字 意味
\n 改行
PS1='\e[32m\u@\h \e[35m\t \e[34m\w\n\e[0m\$ '