🎨

JenkinsのAnsiColor Pluginで色付けするときの文字列の意味

2024/09/24に公開

背景

Jenkinsで、コンソールに色づけしたい場合は、AnsiColor Pluginを用います。

pipeline {
  agent any
  options {
    ansiColor('xterm')
  }
  stages {
    stage('Color sample') {
      steps {
        echo '色付けなし'
        echo 'Hello'

        echo '色付けあり'
        echo '\033[34mHello\033[0m'

        echo 'ここは色付けなし'
      }
    }
  }
}

こちらを実行すると、\033[34m\033[0mで囲った部分が青色になります。

謎の文字列の意味

上記の例の、\033[34m\033[0mの文字列の意味は何でしょうか。
答えは、wikipediaに書いてあるので、確認してみましょう。

https://en.wikipedia.org/wiki/ANSI_escape_code

\033[34mを、\,\0,\033,\033[,\033[ m,\033[34mの順にみていきます。

\: バックスラッシュ

\(バックスラッシュ)は、UNIX環境において、通常記述できない文字を記述する方法として用いられています。\nで改行、\tでタブなどがその代表例です。

参考:
https://ja.wikipedia.org/wiki/バックスラッシュ

\0: 続く数字が、8進数表記で文字コードを表す

バックスラッシュに続く0は、"次に続く数字は8進数"ということを表します。

(ちなみに、xだと"次に続く文字列は16進数"ということを表します。)

\033: ASCIIエスケープ文字(ESC)

\033の部分は、ASCIIエスケープ文字を表します。

上記でみたとおり、\0に続く部分は8進数表記です。
8進の33は、10進数で27、16進数で1Bです。
ASCIIコード表で1Bを探すと、ESCとなることがわかります。これがASCIIエスケープ文字です。

参考:
https://www.asciim.cn/jp/

エスケープ文字が入力されると、システムは(通常の文字入力以外の)さまざまな動作を行います。
vi(やemacs)でコマンドモードに入るイメージです。
viやemacsがわからない場合な、Wordで編集メニューを選択する感じをイメージするとよいです。

\033[: 編集中の文字列に対する操作を行う

\033に続く文字で、どのような動作をするのか指定します。
[を指定すると、"文字列に対する操作"といった意味になります。(英語では、"Control Sequence Introducer")

(ほかには、]は、"OSに対する操作"という意味があります。)

\033[ m: 文字の色とスタイル

一旦次の34は飛ばして、末尾のmを説明します。
末尾のmは、"文字の色とスタイル"を表します。(英語では、"Select Graphic Rendition")

\033[34m:文字を青色に装飾する

\033[mの間に挟まれた部分に、数字を指定することで、どのような文字装飾を施すか指定できます。
34は、"文字色を青にする"という意味です。30は黒、31は赤、など番号によって対応する色が決まっています。背景色を変更することもできます。詳しくは、WikipediaのColorsの章を参考にしてください。

https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

文字スタイルも変更することが可能です。よく使いそうなものを載せます。

番号 スタイル
1 太字
2 細字
3 斜体
4 下線
22 通常の文字の太さ
23 斜体でない、通常の文字

\033[0m:文字のフォーマットをなくす

文字の色とスタイルに、0を指定すると、それまでに使用されていた文字のスタイルを元に戻すことができます。

おまけ:文字装飾を組み合わせる

ちなみに、複数の文字装飾を組み合わせることが可能です。

// 斜体、黄色背景、青文字
echo '\033[3m\033[103m\033[34mHello\033[0m'

実行結果:

おわりに

Wikipediaには、歴史的な経緯や、その他のコマンドなど書いてあり、おもしろいです。日本語のページがなくて残念です。

環境

Jenkins: 2.462.2

Discussion