2022/07/07¶
ANSI escape codeについて¶
ターミナル上でのカーソル位置、色、フォント、スタイル等のオプションを制御するための標準
Unixライクなシステムのターミナルはほとんどの場合これをサポートしている
とりあえずシェルスクリプトやコマンド上で使う文にはほぼ確実に使える
この中で今回気になったのは色彩の制御
CSI(Control Sequence Introducer)¶
ESC[で実行される
SGR(Select Graphic Rendition)¶
CSI n mで実行される
代表的なもの¶
n |
名称 |
説明 |
|---|---|---|
0 |
リセット |
すべての属性がオフになる |
1 |
太字 |
文字を太字もしくは強度の大きなものにする |
3 |
斜字 |
文字をイタリックにする(ターミナルによってはサポートされておらず逆転もしくは点滅として扱われる) |
4 |
下線 |
文字に下線を引く |
5 |
(ゆっくり)点滅 |
1分あたり150回未満の点滅をする |
30-37 |
文字色 |
文字色を変更する |
38 |
文字色(rgb指定) |
続けて引数を取り色彩の指定 |
40-47 |
背景色 |
背景色を変更する |
48 |
背景色(rgb指定) |
続けて引数を取り色彩を指定 |
73 |
上付き字 |
文字を上付き字にする |
74 |
添字 |
文字を添え字にする |
90-97 |
(明るい)文字色 |
明るい文字色に変更する |
100-107 |
(明るい)背景色 |
明るい背景色に変更する |
30,40番台は
0から黒、赤、緑、黄色、青、紫、シアン、白
90,100番台は
0から明るい黒、明るい赤、明るい緑、明るい黄色、明るい青、明るい紫、明るいシアン、明るい白となる
その他8bitカラー、24bitカラーは参考内のリンク参照
実際に動かしてみて¶
とりあえず色々出力してみた
#!/bin/bash
prefix="\x1b["
suffix="m"
RESET="${prefix}${suffix}"
for i in `seq 30 37`
do
for j in 1 2 3
do
for k in `seq 40 47`
do
printf "${prefix}${i};${j};${k}${suffix}"
echo -n "${prefix}${i};${j};${k}${suffix}"
printf "${RESET}"
done
echo -e "${RESET}"
done
done
printf "${RESET}"
8bit colorの出力例
#!/bin/bash
prefix="\x1b["
suffix="m"
RESET="${prefix}${suffix}"
i=0
j=0
#16回実行して改行を繰り返す
while [ "$i" -lt 255 ]
do
j=0
while [ "$j" -lt 16 ]
do
printf "${prefix}38;5;${i}${suffix}"
printf "${j},"
j=`expr "$j" + 1`
i=`expr "$i" + 1`
done
printf "\n"
done
printf "${RESET}"
24bit colorの出力例
#!/bin/bash
prefix="\x1b["
suffix="m"
RESET="${prefix}${suffix}"
i=0
j=0
r=0
g=0
b=0
#16回実行して改行を繰り返す
while [ "$g" -lt 255 ]
do
b=0
while [ "$b" -lt 255 ]
do
i=0
while [ "$i" -lt 16 ]
do
printf "${prefix}48;2;${r};${g};${b}${suffix}"
printf "${prefix}38;2;${r};${g};${b}${suffix}"
printf " "
printf "${RESET}"
i=`expr "$i" + 1`
b=`expr "$b" + 16`
done
printf "\n"
g=`expr "$g" + 16`
done
done
printf "${RESET}"
まとめ¶
macのターミナル、xfceターミナル、x11ターミナルで試してみた
macのターミナルではrgb指定だと色が出力されなかった
その他は問題なく出力された
なにかのインストールスクリプトなんかを書くときは0-7までを使うのが無難で、それ以外のターミナル装飾なんかに使いたい場合はrgb指定を使うのもいいかも