• ANSI Terminal Echo

Windowsでは、コンソールアプリケーションから画面がめん制御せいぎょするには、コンソールAPIを使つかうことになっているが、UNIX/Linuxでは、エスケープシーケンス(エスケープコード、コントロールシーケンスなどともぶことがある)で制御せいぎょするのが普通ふつうだ(写真しゃしん01)。エスケープシーケンスとは、もともとは端末たんまつ装置そうちのための制御せいぎょコードで、ANSI(American National Standards Institute。米国べいこく標準ひょうじゅん協会きょうかい)がANSI X3.64(1979ねん)として規格きかくしたことにちなみ、ANSIエスケープシーケンスとばれることがある。また、この規格きかく準拠じゅんきょしたきゅうDECしゃ端末たんまつ装置そうちVTシリーズがひろ使つかわれたことからVTエスケープシーケンスともばれる。なお、ANSI X3.64とECMA-48(1976ねん。ヨーロッパの規格きかく)は、ほぼおなじである。その、これらの規格きかくは、ISO/IEC 6429として国際こくさい規格きかくとなった。

  • 写真しゃしん01: エスケープシーケンスによるテキストの表示ひょうじ。Linux(中央ちゅうおう緑色みどりいろのプロンプト)やPowerShell(下部かぶしろいプロンプト)はEscコードを文字もじれつ挿入そうにゅうできるため、簡単かんたんにANSIエスケープシーケンスが使つかえる。cmd.exe(ウィンドウ冒頭ぼうとう部分ぶぶん)は、みコマンドではEscコードをあつかえないのでC#でコマンドをつくった

エスケープシーケンスは、「Esc」コード(0x1B)を先頭せんとう文字もじわせて、カーソルの制御せいぎょなどをおこなう。その文字もじいろ属性ぞくせい(イタリック、下線かせん反転はんてん点滅てんめつこう輝度きどなど)を指定していできる。エディタなどアプリケーションからの本格ほんかくてき利用りようには、UNIX/Linuxけいではncuresなどのライブラリを利用りようするが、スクリプトで文字もじにちょっといろをつけたいなんて場合ばあいには、文字もじれつちゅう直書じきしょきすることがある。このときに利用りようするエスケープシーケンスにはSGR(Select Graphic Rendition)という名称めいしょうがある。現在げんざいでもエスケープシーケンスを区別くべつするためにANSI X3.64などでけられた名前なまえ使つかうことがおおい。

基本きほんてき形式けいしきは、「\e[<パラメータ>m」となる。UNIX/Linuxけいでは文字もじれつにEscコードをむときエスケープ文字もじ使つかい\eと表記ひょうきする。にはASCIIコードの数字すうじ文字もじ指定していする。ひょう01は、そのパラメータをしめ数字すうじだ。“[”と"m"のあいだには複数ふくすうのパラメータをくことができ、その場合ばあいには「;」で区切くぎる。最新さいしんのISO/IEC 6429では、0~69まで定義ていぎしてあるが、どれを実装じっそうするのかは、はしまつ端末たんまつソフトウェア)次第しだいおおくの場合ばあいふるいANSI X3.64程度ていどになっていることもおおい。なお、「\e[」の部分ぶぶんは、規格きかくではCSI(Control Sequence Introducer)と表記ひょうきされる。

  • ひょう01

たとえば、Linuxのbashなら「echo -e "\e[34mTest\e[0m"」とすれば、青色あおいろ文字もじ表示ひょうじされるはずだ。先頭せんとうの「\e[34m」が文字もじしょくあお指定していで、末尾まつびの「\e[0m」は属性ぞくせいのリセットである。これをわすれるとずっといろわったままになる。

複数ふくすう属性ぞくせいをまとめて記述きじゅつするときには、「echo -e "\e[3;34;43mTest\e[0m"」とする。これは、文字もじ斜体しゃたいにして文字もじあお背景はいけい黄色きいろにするものだ。

PowerShellのWrite-Hostコマンドは、文字もじしょく表示ひょうじするためのオプションをっているので、わざわざいろ指定していをエスケープシーケンスでおこな必要ひつようはないが、オプションで指定していできないイタリック表示ひょうじなどをおこなうなら、


write-host "This is $([char]0x1B)[3mItalic$([char]0x1B)[0m string"

とする。なお、PowerShell 7以降いこうなら「$([char]0x1B)」のわりにEscコードをあらわす「`e」が使つかえる。

ANSI X3.64ではパラメータ“1”は、「太字ふとじまたはこう輝度きど」と定義ていぎしてあるが、こう輝度きど表示ひょうじする端末たんまつソフトがすくなくない。というのは、太字ふとじにすると画面がめんじょうでの文字もじサイズが変化へんかしてしまうため、とうはばフォントを使つか端末たんまつエミュレーターではあつかいづらい。文字もじ間隔かんかく太字ふとじわせなければならず、通常つうじょう文字もじ表示ひょうじだと文字もじ間隔かんかくがあきすぎになってしまうからだ。というわけでこれを指定していすると、ほとんどの端末たんまつソフトでいろあかるいいろ表示ひょうじされる。また、SGRにはてい輝度きど“2”もあるので、


echo -e "\e[34m通常つうじょう\e[1mこう輝度きど\e[2mてい輝度きど"

とすると、おなあおでも3段階だんかい表示ひょうじ可能かのうになる(Windows Terminalの場合ばあい。もちろん端末たんまつ依存いぞんである)。

残念ざんねんながらcmd.exeの場合ばあい、Escコードを文字もじれつれるための記法きほうがない。また、標準ひょうじゅんコンソールウィンドウ(conhostウィンドウ)は、デフォルトでは、エスケープシーケンスを解釈かいしゃくしないようになっている。このため、プログラムをつくらないとエスケープシーケンスが利用りようできない。

Windowsでは、ながらくWindows固有こゆうのコンソールAPIを使つかって画面がめん制御せいぎょおこなうこととされてきたが、Windows 10でコンソールが改良かいりょうされるとき、WSLでLinuxがエスケープシーケンスを使つかうため、ANSIエスケープシーケンスに対応たいおうした。Microsoftのドキュメントをると、今後こんごは、エスケープシーケンスを使つか方向ほうこうになるようだ。1989ねん開発かいはつはじまったWindows NTでエスケープシーケンスとったMicrosoftだが、結局けっきょくエスケープシーケンスの利用りようもどるようだ。ただ、Windowsには、ncursesのようなライブラリがないため、Windows 11では、このあたりを強化きょうかすることになるだろう。

タイトルのもとネタは、Michael Crichtonの“The Terminal Man”にする予定よていだったが、あまりにありきたりなのでかんがなおすことにした。そこでおもしたのが「ターミナルエコー」だが、これはかつてJR吉祥寺きちじょうじえきにあったえきビルの名前なまえ。そもそもターミナルとは、ローマ神話しんわのテルミヌスしん語源ごげん国境こっきょうにテルミヌスにちなむいしいたため、後年こうねん末端まったん」、「境界きょうかい」の意味いみち、えき空港くうこうあらわ言葉ことばになった。端末たんまつ装置そうちもここからており「The Terminal Man」は、コンピュータとの関係かんけいからけられた題名だいめいだ。おな名前なまえで1974ねん映画えいがされたが、邦題ほうだいは「電子でんし頭脳ずのう人間にんげん」だった。なお、同名どうめい小説しょうせつは、もう1つあり、こっちは、空港くうこうむことを余儀よぎなくされたひと自伝じでん。スピルバーグの映画えいがTerminal(邦題ほうだいはターミナル)のもとになった。Echoは木霊こだま意味いみだが、ギリシャ神話しんわ妖精ようせい名前なまえでもある。最近さいきんわかひとには、端末たんまつソフトやエスケープシーケンスなどは、もう「神話しんわ時代じだいはなしなのかもしれないが。