ITエンジニアによるITエンジニアのためのブログ

Bashのシェルプロンプトをカスタマイズしよう

この記事では、Bashのシェルプロンプト(PS1)を自分好みにカスタマイズする方法を、基本から応用まで分かりやすく解説します。

目次

  1. シェルプロンプトの役割と基本カスタマイズ
  2. ターミナルのタイトルバーを動的に変更する
  3. なぜ設定は ~/.bashrc に書くのか?
  4. まとめ
  5. 図表:全エスケープシーケンス一覧

1. シェルプロンプトの役割と基本カスタマイズ

シェルプロンプトとは、ターミナルでコマンドの入力を待っているときに表示される文字列のことです。普段何気なく目にしている user@hostname:~$ のような部分がそれにあたります。この表示は PS1 という環境変数で定義されています。

PS1 の主な役割は、ユーザーに現在の作業状況(ユーザー名、ホスト名、現在のディレクトリなど)を知らせることです。これをカスタマイズすることで、作業効率を大きく向上させることができます。

PS1 には、単なる文字列だけでなく、特別な意味を持つ「エスケープシーケンス」を組み込むことで、様々な情報を動的に表示できます。

代表的なエスケープシーケンス

シーケンス説明
\u現在のユーザー名
\hホスト名(最初の . まで)
\H完全なホスト名
\w現在のディレクトリ(ホームディレクトリは ~ で省略)
\W現在のディレクトリの末尾のみ
\$一般ユーザーなら $、rootユーザーなら # を表示
\d日付(例: 金 7月 18)
\t現在時刻(24時間表記 HH:MM:SS)
\n改行
\!コマンドの履歴番号

全てのエスケープシーケンスの一覧はこの記事の最後に記載します。

色の付け方

プロンプトに色を付けるには、カラーコードを \[\] で囲みます。これは「画面に表示されない特殊な文字列」であることをシェルに伝えるエスケープシーケンスで、これがないと表示が崩れる原因になります。

  • \[\033[<色コード>m\]: 色の変更開始
  • \[\033[00m\]: 色をリセット

【設定例1】色なしの基本的なプロンプト

user@hostname:~$ という一般的なプロンプトを設定します。

PS1='\u@\h:\w\$ '

【設定例2】色付きのプロンプト

ユーザー名とホスト名を緑色に、ディレクトリを青色にしてみましょう。

PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

これで、以下の画像のような色付きプロンプトになります。

応用:コマンドの実行結果を埋め込む

プロンプトには、コマンドの実行結果を埋め込むことも可能です。これにより、Gitのブランチ名や、使用中のプログラミング言語のバージョンなどを常に表示できます。

例えば筆者はRubyを良く使うので、現在のRubyバージョンをrvm-promptというコマンドで表示しています。

【設定例3】Rubyのバージョンを表示する

PS1='\[\033[01;32m\]\u@\h-$(rvm-prompt)\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# シェルプロンプト
taro@my_pc-ruby-2.7.8:~$

重要なポイント: プロンプトが表示されるたびにコマンドが実行されるようにするには、PS1 の定義を**シングルクォート(')**で囲み、コマンド実行部分を \$(コマンド) のように記述する必要があります。

2. ターミナルのタイトルバーを動的に変更する

PS1には、ターミナル設定をコントロールするシーケンスを設定することもできます。

例えば、複数のターミナルを開いて作業していると、どれがどの作業か分からなくなりがちです。そんな時は、ターミナルのタイトルバーに現在のディレクトリなどの情報を表示させると便利です。

これも PS1 の特殊なエスケープシーケンスを使って実現できます。

# 既存のPS1設定の先頭に、タイトル設定シーケンスを追加する
PS1="\[\e]0;\u@\h: \w\a\]$PS1"

この設定を追加すると、ターミナル(やタブ)のタイトルが ユーザー名@ホスト名: 現在のディレクトリ のように自動で更新されるようになります。

部分意味
\[非表示の文字シーケンスの始まり。
\e]0;XTermなどのターミナルエミュレータのタイトルを設定するためのコントロールシーケンスの開始
\u@\h: \wタイトルに表示したい内容(ユーザー名、ホスト名、ディレクトリ)。
\a通常はビープ音を鳴らすためのエスケープシーケンスですが、この文脈ではXTermのタイトル設定シーケンスの終了として機能します。正式にはBell文字(ASCIIコード7)です。
\]非表示シーケンスの終了。
$PS1既存の PS1 の値を継承することを意味します。つまり、この新しいタイトルバー設定の後に、元々のシェルプロンプト設定(例えば user@host:~$ など)が続きます。

例えば、ユーザーが taro でホスト名が my_pc、現在のディレクトリが /home/taro/Downloads の場合、タイトルバーには以下のように表示されます。

taro@my_pc: ~/Downloads

これにより、複数のターミナルウィンドウを開いている場合に、どのウィンドウがどのユーザーでどのディレクトリにいるのかを一目で把握しやすくなります。

3. なぜ設定は ~/.bashrc に書くのか?

PS1 の設定は、~/.bash_profile~/.profile ではなく、~/.bashrc に記述するのが一般的です。これには明確な理由があります。

  • 対話型シェル向けの設定だから: PS1 は、人がコマンドを打ち込む「対話型」のシェルでのみ意味を持ちます。~/.bashrc はこの対話型のシェルが起動するたびに読み込まれるため、PS1 の設定場所として最適です。シェルスクリプトの実行(非対話型シェル)や、システムがバックグラウンドで起動するプロセスには、プロンプトは一切必要ありません。
  • Bash固有の設定だから: PS1 の書式はBash特有のものです。~/.bashrc はBash専用の設定ファイルなので、ここに書くのが作法として正しいです。(~/.profile は他のシェルでも読み込まれる可能性があります。)
  • GUIからのターミナル起動に対応するため: デスクトップ環境からGNOME Terminalなどのターミナルを起動した場合、多くは「非ログインシェル」として起動し、~/.bashrc のみを読み込みます。もし ~/.bash_profile に設定を書いてしまうと、せっかくのカスタムプロンプトが反映されません。

多くの環境では、~/.bash_profile の中で ~/.bashrc を読み込むような設定が最初から記述されているため、結果的にどちらに書いても動くように見えますが、役割を理解して ~/.bashrc に書くのがベストプラクティスです。

4. まとめ

シェルプロンプトは、開発者やエンジニアが毎日何度も目にする、いわば「仕事場の顔」です。少し手間をかけるだけで、作業環境は驚くほど快適になります。

この記事を参考に、ぜひあなただけの最強のプロンプトを作ってみてください!

5. 図表:全エスケープシーケンス一覧

PS1で使える全エスケープシーケンスの一覧です。

シーケンス説明
\aBell文字(ASCIIコード7)
\d「 曜日、月、日」形式の日付(例:金 7月 18)
\D{フォーマット}C言語のstrftime関数による日付。(例:\D{%Y-%m-%d}だと2025-07-18になります)
\eエスケープ文字(ASCIIコード33)
\hホスト名(最初の.まで)
\H完全なホスト名
\jシェルの現在のジョブ数
\lシェルのターミナルデバイス番号の末尾 (例:ttyコマンドで/dev/pts/3と表示される場合、3と表示されます)
\nnewline (改行)
\rcarriage return(改行)
\sシェル名。$0環境変数の末尾。(例:bash)
\t現在時刻(24時間表記 HH:MM:SS 例:16:18:13)
\T現在時刻(12時間表記 HH:MM:SS 例:04:18:13)
\@現在時刻(12時間表記 HH:MM 午前/午後 例:04:18 午後)
\A現在時刻(24時間表記 HH:MM 午前/午後 例:16:18 午後)
\u現在のユーザー名
\vbashバージョン名(例:5.00)
\Vbashリリース名。バージョン+パッチレベル(例:5.0.17)
\w現在のディレクトリ(ホームディレクトリは ~ で省略。例:~/Downloads)
\W現在ディレクトリの末尾(ホームディレクトリは~で短縮。例: Downloads)
\!現在のコマンドの履歴番号(例:2000)
\#現在のコマンドのコマンド番号(例:1)
\$一般ユーザーなら $、rootユーザーなら # を表示
\nnn:8進数nnnに対応する文字。(例:色指定をしたい場合、\eでエスケープシーケンスを始めても良いですが、ACIIエスケープは8進数だと33なので、\033と記載することも可能です)
\\バックスラッシュ
\[非表示の文字シーケンスの始まり。ターミナルのコントロールシーケンスの記載が可能。
\]非表示の文字シーケンスの終了