Bashで\033]
で始まる多くのエスケープシーケンスを見つけましたが、これらのシーケンスは何で、なぜ\033]
で始まるのですか?
文字列は実際には\033[
であり、それだけではありません。
その開始ブラケットの後には、一連の数字と記号が続きます。この文字列はエスケープシーケンスと呼ばれ、コンソールのカーソルとテキストの色などを制御するために使用されます。
非印刷エスケープシーケンスは
\[\033[ and \]
で囲む必要があります
エスケープシーケンスがテキストの色を制御している場合、m
が続きます。
カラーシーケンスの表は次のとおりです。
Black 0;30 Dark Gray 1;30
Blue 0;34 Light Blue 1;34
Green 0;32 Light Green 1;32
Cyan 0;36 Light Cyan 1;36
Red 0;31 Light Red 1;31
Purple 0;35 Light Purple 1;35
Brown 0;33 Yellow 1;33
Light Gray 0;37 White 1;37
したがって、コンソールプロンプトを青にしたい場合は、次のエスケープシーケンスを使用します(ファイル名に忘れています)。
\[\033[34m\]
(m
に注意してください)
ただし、このエスケープシーケンスは色を制御するだけではありません。カーソルの動きも制御できます。以下に、移動コードとその動作方法を記載した表/リストを示します。
カーソルを配置します。
\033[<L>;<C>H
または
\033[<L>;<C>f
カーソルを行Lおよび列Cに置きます。
カーソルをN行上に移動します。
\033[<N>A
カーソルをN行下に移動します。
\033[<N>B
カーソルをN列前方に移動します。
\033[<N>C
カーソルをN列後方に移動します。
\033[<N>D
画面をクリアし、(0,0)に移動します。
\033[2J
行末まで消去:
\033[K
カーソル位置を保存:
\033[s
カーソル位置を復元します。
\033[u
最後の2つは、使用しているターミナルエミュレータでは動作しない可能性があることに注意してください。明らかに、xterm
とnxterm
のみがこれら2つのシーケンスを使用します。
これらのエスケープシーケンスの1つを使用した例:行3、列(文字)9にカーソルを置きたいとします。そのために、
\[033\[3;9H]
(列0が最初の位置であると仮定しているため、8番目の文字になります)。
ソース: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (6.2も参照)
これらは端末の制御コマンドです。
ターミナルはもともと ややダムデバイス シリアルポートに接続されていて、現在のメニューを備えた派手なマルチタブGUIソフトウェアではありません。文字(バイト)のストリームのみを受け取ったため、データ(画面に印刷するもの)とコマンド(印刷方法)の間には明確な分離はありませんでした。代わりに、コマンドは特別な制御文字で表されます。
明らかな制御文字は、ラインフィード(改行)、バックスペース、ベルビープのようなものですが、より具体的なコマンドは、ESC
文字(10進数のコード27、16進数の0x1b、または033で始まる文字のシーケンスとして与えられます8進数)。多くの場合、例のように^[
または\033
として表されます。
シーケンスESC [
はCSIまたはコントロールシーケンスイントロデューサーと呼ばれ、オプションの数値パラメーターでコマンドを開始し、通常はメインコマンドを定義する文字で終わります。一般的なエスケープシーケンスのほとんどは、このクラスに分類されます。
エスケープコードのリストは、たとえば console_codes(4)
manページ、および ANSIエスケープコード のWikipediaページで。
いくつかの例:
ESC [ 4 A move cursor 4 lines up (4 can be any number)
ESC [ 5 B move cursor 5 lines down
ESC [ 2 K erase current line
ESC [ 30;46 m set black text (30) on cyan background (46)
ESC [ 0 m reset color and attributes
コマンドをテストするには、たとえばバッシュ。 -e
フラグを使用して、組み込みecho
コマンドは、ESC
文字の表現として\033
を受け入れます。
例えば。これは、画面の中央に色で挨拶を印刷し、通常は元のカーソル位置に別の挨拶を印刷します。
echo -e '\033[s\033[12;30f\033[30;46m Hello! \033[0m\033[uhello'
あなたが言及したシーケンスESC ]
はOSCまたはオペレーティングシステムコマンドです。これは主にxterm
などにウィンドウタイトルを設定するコマンドで使用されます:
echo -e '\033]0;new window title\a'
さらに、一部の端末で国別文字セットを設定するESC ( A
(およびその他の文字)があります。これは 潜在的に陽気な効果 です。
これらは ANSIエスケープコード と呼ばれ、 console_codesのマニュアルページ にリストされています。これらはBash固有ではありませんが、ターミナルがサポートしている限り、どのコンソールアプリケーションでも動作します(ほとんどのターミナルエミュレーターはサポートしています)。
エスケープとそれに続く右角括弧 escape_]
_ オペレーティングシステムコマンドを導入するために使用されます(OSC
)。
ECMA-48 にあり、xtermが使用する制御シーケンスの概要を XTerm Control Sequences で読むことができます。 、たとえば、端末ウィンドウのタイトルを変更するため。
エスケープシーケンスは、異なる文字で開始できます。 XTermの制御シーケンスの C1(8ビット)制御文字 セクションでは、それらのいくつかに言及しています:CSI
(これは escape[
、APC
、DCS
、PM
。異なる(2番目の)文字の理由は、ペア(エスケープと _]
_)は、異なるタイプのエスケープシーケンスに使用される1バイトの制御文字に関連付けられています。
仕様を読むと、CSI
が文字列を許可しているのに対し、OSC
が数値パラメーターを持つコントロールに使用されていることに気付くでしょう。構文だけでなく、この規格を作成した委員会は、APC
およびPM
とは異なるDCS
およびOSC
の使用を念頭に置いていました。
他の回答で説明されている「エスケープシーケンス」は、使用している端末タイプ(ほとんどの場合「ANSI」または派生/類似のもの)に依存します。
$ echo $TERM
xterm
端末の(多少)独立したスクリプトを作成したいが、まだ使用している場合色やその他の特別な機能については、man terminfo
のコンテンツをご覧ください。
例えば.
$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."
.test.
をtest
とともに印刷します。背景が黄色で前景色が赤です。これは、実際に同じ方法で色を使用できるすべての端末で機能します。
実際に印刷される内容を確認するには、次のようにod -t x1z
にパイプします
$ tput sgr0 | od -t x1z
0000000 1b 28 42 1b 5b 6d >.(B.[m<
0000006
...値は16進数で表示されます(「x」のため)。