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指定)

続けて引数を取り色彩の指定
5;n or 2;r;b;g

40-47

背景色

背景色を変更する

48

背景色(rgb指定)

続けて引数を取り色彩を指定
5;n or 2;r;b;g

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指定を使うのもいいかも

参考