やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

RaspbianでPS1を設定するシェルスクリプトを作った

ターミナル(コマンドプロンプト)の色やテキストを設定する。

成果物

GitHubShell.Color.20180307110000

f:id:ytyaru:20180307071946p:plain
f:id:ytyaru:20180307071955p:plain

問題

pythonのvenvをアクティブにしたときにPS1が無色になった。

解決

自前でPS1を作るスクリプトを書いた。

方法

環境変数PS1に所定の書式を入力する。

.bashrcファイルのデフォルト設定は以下。

.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w \$\[\033[00m\] '

説明

項目 説明
${debian_chroot} chrootでルートディレクトリを変更するときの表示
\u OSのユーザ名表示
\h OSのホストマシン名表示
\w ワーキングディレクトリパス表示
\u OSのユーザ名表示
\033[... ANSI_escape_code

pythonのvenvはテキストを直接指定する。

色はANSI_escape_codeで設定している。

ANSI_escape_code

ESC Code 説明
\[...\] PS1にANSI_escape_codeを設定するときにこれでSGRを囲う。echo -eのときは不要
\033[...m SGR。文字や背景の色を設定する。...SGR Parameterを入れる。値は0,01;31などの数。0~107までの10進数。配列のときは;でつなげる。

SGR Parameter

ESC Code 説明
\033[0m SGRのリセット
\033[31m SGRに31(文字色=赤)をセット
\033[91m SGRに91(文字色=明るい赤)をセット
\033[1;31m SGRに01;31(1=Bold(太字), 31=文字色=赤)をセット

たとえば、以下のようにターミナルでコマンドを実行すると、赤い文字が表示される。

$ echo -e '\033[31m赤い文字です'

つまり、{SGR}{任意テキスト}とすると、指定したSGRで任意テキストを装飾できる。

色の指定方法

「\033[nm」で指定する。nに色を指定するSGR Parameterを入れる。

色の指定方法は3パターンある。(システムによって対応状況が違う。色数が少ないほど多くの環境でサポートされている)

色深度 文字色 背景色
規定16色 30..37, 90..97 40..47, 100..107 \033[31m
規定256色 38;5;0..255 48;5;0..255 \033[38;5;128m
24bit color 38;2;R;G;B 48;2;R;G;B \033[38;2;255;196;64m
規定256色

いわゆるインデックスカラー。ただし各インデックスの色はシステム規定値であり、任意に変更できない。

説明 規定16色との対応
0..7 黒、赤、緑、黄、青、マゼンタ、シアン、白 30..37
8..15 0..7の明るい色 90..97
232..255 グレースケール(黒から白までの24段階) 無し
16..231 6bit color (216色)。16 + 36 * R + 6 * G + B (0 ≤ R,G,B ≤ 5) 無し

6bit colorを計算する関数を書いた。GetColor 5 2 0などのようにRGBの3値を0..5の範囲で与えると、16..231の値を返す。その値Xを「\033[38;5;Xm」にセットする。

24bit color

いわゆるフルカラー。

  • R * G * B (0 ≤ R,G,B ≤ 255)

「\033[38;2;R;G;Bm」とする。SGRの書式に直接指定できる。ただし対応環境は最も少ない。

参考

開発環境