カテゴリー
【シェルスクリプト実践講座】ANSIエスケープシークエンスを使おう①〜基本的な使い方
※ 当ページには【広告/PR】を含む場合があります。
2021/09/25

これからシェルスクリプトをしっかり学んでいきたい方の中には、今後シェルプログラミングでちょっとしたコンソールアプリを作成したい時があるかも知れません。
シェルアプリを作成する上で欠かせないテクニックの核になるのが、
「ANSIエスケープシークエンス」
今回はその基本操作について整理していきたいと思います。
基礎の基礎
シェルコマンドでエスケープシークエンスを呼び出すためには、echoコマンドに
-e
$ echo -e "<画面制御文>"
#👇Bash等のANSI-Cクォートが使える場合には以下でもOK
$ echo $'<画面制御文>'
エスケープシーケンスは、その名の通りエスケープ文字から始まる特殊制御文字列を端末に送ることで様々な機能・操作を行うことができます。
ちなみにLinuxではディストリビューション毎に標準搭載されているターミナルアプリケーションによって多少の挙動の違いがあります。
軒並みエスケープ文字は以下のどれか使えると思います。
\e
\033
\x1b
最近のbashでは実際どちらでも動くと思いますので、どれを使って書いても構いません。
この記事では
\e
エスケープシークエンスの画面制御文字列はおおよそ以下のようなに大まかに3つの構成パートで記述される構文をしています。
___① ____② ____③
\e[ 数字 文字
①の
\e[
②は主に数字が指定されて使われることがほとんどですが、省略されたり、
;
③は操作や制御の種類を識別するための文字が指定されます。
例えば、出力文字列をイタリックに表示を変えたい場合には以下を実行します。
$ echo -e "\e[3m"
すると以下の図のように、このエスケープシークエンスが出力された以降の端末で持続的にイタリックの文字出力になっています。 (※Zshではエスケープシークエンス出力はコマンドを実行する度に初期化されるので、bashのように状態が持続することはありません。)

これをデフォルトの状態に戻す場合には
$ echo -e "\e[0m"
とします。

このエスケープシークエンスは一連した文字列の合間合間に挿入することもできます。
$ echo -e "普通の文字列が...\e[3m一旦イタ リックになって\e[0m...また普通に戻ります。"
という部分的にイタリックに出力を変更したいコマンドを実行すると、

というように利用することになります。
制御操作の作法
ここからはざっと操作の種類別にまとめてみます。
制御文字列の構成を再掲しますと、
___① ____② ____③
\e[ 数字 文字
ということを念頭に以下表形式でエスケープシークエンスをまとめます。
文字種を変える
先程の例で文字をイタリック調に表示したりしてみましたが、文字の出力を変える操作には以下のようなものがあります。
色
文字や背景に着色することも可能です。
端末エミュレータごとで、色を変更後にデフォルト値にリセットされる/そのまま色が維持されるなど挙動が少し異なるかも知れません。
とにかく処理の最後にリセットしたい場合には
\e[m
文字の色の変更
色拡張の機能はもしかするとターミナルによっては対応してないかも知れません。
背景色の変更
背景色も基本的に文字色のルールとほぼ同じです。
カーソル操作
ここからがANSIエスケープシークエンスの真骨頂であるカーソル操作の主な機能です。
なお一覧に載せた機能は全てのターミナルに対応している訳ではないので、一部使えないことにご留意ください。
だいたいxterm系のターミナルでは、ほとんど全ての機能に対応してそうですが、他は端末エミュレータでどうかは不確かです。
その都度確認頂くとして、様々なOSの端末で動くシェルアプリを作成したい場合、あまりマイナーな処理(上記でいうと
s
とりあえず、現在の端末に次のスクリプトを入力してみましょう。
$ echo -e -n "\e[7B\e[20C\e[1;37m\e[41m---- HELLO, MY FIRST SHELL APP! ----\n\e[4A\e[m"
まずが端末の上から何行か下でこれを実行して下さい。)

まず最初はカーソルを7行下げて、20文字目右に移動し、文字色を白、背景色を赤に変えております。
そこから、「---- HELLO, MY FIRST SHELL APP! ----」を端末に出力させています。
さらに文字列の出力後、カーソル位置から4行上げて、設定をデフォルトに戻して処理が完了しています。
なお、ANSIエスケープシークエンスを使わなくても、
tputコマンド
ただし、画面上への描画位置をより柔軟に制御したい場合、tputで開発を進めていくと、
tput 〇〇;tput △△;tput □□;...
tputで組んでいたシェルアプリを途中でエスケープシークエンスにリファクタリングするのは非常に骨が折れますので、どうせなら最初からエスケープシークエンスでカーソル操作を作成してしたほうが良いと思います。
スクロール操作
画面のスクロールという操作もエスケープシークエンスで実現できます。
スクロールとカーソル移動は一見同じことをやっているようで、違う操作です。
挙動の違いが気になる方は実際にやってみてください。
出力の削除
出力した文字を消去する操作もエスケープシークエンスで可能です。
まとめ
今回はシェルアプリ開発で必須のANSIエスケープシークエンスの基礎をまとめてみました。
このGUIアプリケーション全盛期に、CUIアプリ開発の話などかなりマイナーな話かも知れませんが、やっていくとかなり楽しい世界が広がっていると思います。
どんなシェルアプリを作りたいか追々考えていくとして、まずがエスケープシークエンスの操作に慣れることから始められてはいかがでしょうか。
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー