#046
posted on 2021.06.13

bashを使っているターミナルのプロンプトの表示内容と色を変更。

初期状態では「ホスト名:カレントディレクトリ ユーザー名$」で表示されるmacOSのターミナルのプロンプトが見ずらいので、プロンプトの表示内容と色を変更する方法のメモ。(ログインシェルにbashを使っている場合。)

 

プロンプト表示の設定が格納されているシェル変数「PS1」の設定値を変更する。

現在の変数の値はコマンド「echo $変数名」で確認できる。

 

macOS High Sierra バージョン 10.13.6
ターミナル バージョン2.8.3 (404.1)
GNU bash, version 3.2.57 で確認。

 

  1. ホームディレクトリにbashの設定ファイル「.bash_profile」と「.bashrc」を作成。
  2. 「.bash_profile」に「.bashrc」を読み込むシェルスクリプトを記述。
  3. 「.bashrc」に、プロンプト表示設定の値を変数「PS1」に代入して環境変数に書き出すシェルスクリプトを記述。
  4. ターミナルを再起動してプロンプト表示を確認。

 

 

「.bash_profile」と「.bashrc」を作成

bashの初期設定用のファイル「.bash_profile」と「.bashrc」をホームディレクトリに作成する。(macOSのデフォルト設定では2つとも存在しない。)

ホームディレクトリに「.bash_profile」ファイルと「.bashrc」ファイルが存在すると、シェル起動時に自動的に読み込まれ、記述されているシェルスクリプトが実行される。

  • 「.bash_profile」は、ログインシェル起動時にだけ読み込まれる設定ファイル。
  • 「.bashrc」は、ログインシェル以外でシェル起動時に読み込まれる設定ファイル。

※ 「.bash_profile」に「.bashrc」を読み込むように記述して、ログイン時にも「.bashrc」を実行するのが一般的なようなので準拠。

 

「.bash_profile」と「.bashrc」がホームディレクトリに存在するかを確認。

ls -al ~ | grep .bash

ls : list segmentsの略。指定したディレクトリ内にあるディレクトリとファイルの一覧を表示する。オプション「-a」は隠しファイルを含めたすべてのディレクトリとファイルを表示、「-l」は各ディレクトリとファイルについての詳細情報を表示。

| : パイプ。コマンドの標準出力を別のコマンドの標準入力として繋げる。

grep : テキストファイルから指定した文字列を含む行を検索して、一致した文字列を含んでいる行を表示する。検索文字列には正規表現も使える。

 

「.bash_profile」と「.bashrc」が無い場合はホームディレクトリにそれぞれ作成。

ターミナル上で作成する場合は「touch」コマンドを使う。Finderでファイルを新規作成しても同じ。

touch ~/.bash_profile
touch ~/.bashrc

touch : 指定したディレクトリやファイルのタイムスタンプを変更する。指定したディレクトやファイルが存在しない場合は新規作成する。

 

 

「.bash_profile」と「.bashrc」に設定を記述

「.bash_profile」に「.bashrc」を読み込む設定を記述、「.bashrc」にプロンプト表示に使う変数の設定を記述。

ファイルの中身は、ターミナル上でCUIエディターのVimなどを起動して編集するか、外部のGUIエディターで直接編集する。

※ ファイルのフォーマットがunix以外になっていると、「syntax error unexpected end of file」という読み込みエラーが出たので注意。(おそらく改行コードが「LF」以外になることが原因。)

 

「.bash_profile」の記述

「.bashrc」ファイルが存在すれば読み込むように記述。

if [ -f ~/.bashrc ] ; then
  . ~/.bashrc
fi

if [ 条件式 ]; then 処理; fi : シェルスクリプトのif文。改行しない場合はセミコロン「;」を使う。条件式と「[」、「]」の間には半角スペースが必要。オプション「-f」は、指定したファイルパスが通常のファイルならば真。(「[ ]」は、「test」コマンドの略式。)

. : ドットコマンド。「source」コマンドと同じ。指定したファイルを現在のシェル上で実行する。(指定したファイル内のシェルスクリプトで実行された変数が現在のシェルにも引き継がれる。)

 

 

「.bashrc」の記述

シェル変数「PS1」の値を定義して「export」コマンドで環境変数として書き出すように記述。

(「PS1」の初期設定の値は、「\h:\W \u\$ 」。)

 

プロンプトを「コマンドの実行番号 [時間] カレントディレクトリ $ 」で表示するように設定する場合の記述。

PS1="\# [\t] \W \$ " #シェル変数を定義
export PS1 #シェル変数を環境変数に設定

export : シェル変数を環境変数として設定する。オプション「-n」で環境変数を削除(シェル変数は残る)、「-p」で環境変数の一覧表示。

 

「PS1」に設定できる値

文字列 出力される内容
\h ドット「.」前までのホスト名
\H 完全表記のホスト名
\u ユーザー名
\w フルパスのカレントディレクトリ
\W カレントディレクトリ
\t 24時間表記の時間(HH:MM:SS)
\T 12時間表記の時間(HH:MM:SS)
\A 秒無しの24時間表記の時間(HH:MM)
\@ AM/PM表記の時間 (HH:MM AM/PM)
\d 日付(曜日 月 日)
\# ログイン後からのコマンド実行番号
\! 履歴でのコマンド実行番号
\$ root権限なら「#」、それ以外のユーザーなら「$」
\n 改行
\[ エスケープシーケンス開始(端末制御シーケンスをプロンプトに埋め込む。)
\] エスケープシーケンス終了(終了は省略できるが環境によってはバグが発生する。)

※ ホスト名は、「リンゴマーク」 > 「システム環境設定」 > 「共有」 > 「編集」から「ローカルホスト名」で変更できる。

 

 

プロンプト表示の文字の装飾

ASCII制御コードを拡張するためのエスケープシーケンス(ANSIエスケープコード)を利用して、プロンプト表示の文字色・背景色の変更、文字のスタイル装飾ができる。

画面出力をコントロールするCSI(Control Sequence Introducer)シーケンスのテキスト属性を設定するSGR(Select Graphics Rendition)のパラーメーターを指定して装飾する。

※ エスケープシーケンスの「\[」と「\]」で囲んだ部分は、bashがプロンプトの大きさの計算を無視する。

※ CSIシーケンスの開始文字列には「\e[」などもあるようだが、バージョンやシェルによって実装が異なるようなので「\033[」を使用。(ASCII制御文字「ESC」のコードは、10進数で「27」、8進数で「033」、16進数で「0x1b」。)

 

文字装飾の記述方法

  1. 「\[」でエスケープシーケンスを開始。
  2. 「\033[」でCSIシーケンスを開始。
  3. 「引数」(装飾のコード値)と「m」(終了文字)を記述。(SGRのパラメーターを指定。)
  4. 「\]」でエスケープシーケンスを終了。
  5. これ以降の出力文字列に装飾が適用される。

(例) 文字色に黒「30」、背景色に赤「41」を指定する「\[\033[30;41m\]」を記述すると、それ以降の出力は黒文字赤背景になる。

※ 引数が複数の場合はセミコロン「;」で区切る。

 

装飾したあとにデフォルトの値(文字色「39」、背景色「49」、すべてクリア「0」)でリセットしなければ、プロンプト以降の出力にも継続して装飾が反映される。(「0m」は省略して「m」と記述できる。)

 

「コマンドの実行番号」を赤文字、「[時間] カレントディレクトリ $」を黄文字にして、以降の装飾はデフォルトに戻す場合の記述。

PS1="\[\033[31m\]\# \[\033[33m\][\t] \W \$ \[\033[m\]"

 

プロンプト表示で設定できる色

実際の色見本(Wikipedia)。

コード

30(文字), 40(背景)

31(文字), 41(背景)
32(文字), 42(背景)
33(文字), 43(背景)
34(文字), 44(背景)
35(文字), 45(背景)
36(文字), 46(背景)
37(文字), 47(背景)
38;5;色コード(文字), 48;5;色コード(背景) 256色で色コード(0~255)を指定(対応環境の場合のみ)
39(文字), 49(背景) デフォルトの色に戻す

※ 文字は90~97、背景は100~107で指定すると明度の強い色も選択できる。

※ GUIでターミナルのメニューから「環境設定」 > 「プロファイル」 > 「テキスト」 > 「ANSIカラー」で該当するコード値に対応する色の設定を変更できる。

 

 

この記事をシェア