web-dev-qa-db-ja.com

「\ 033]」で始まるエスケープシーケンスとはどのようなタイプのシーケンスですか

Bashで\033]で始まる多くのエスケープシーケンスを見つけましたが、これらのシーケンスは何で、なぜ\033]で始まるのですか?

14
Sessho

文字列は実際には\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つは、使用しているターミナルエミュレータでは動作しない可能性があることに注意してください。明らかに、xtermnxtermのみがこれら2つのシーケンスを使用します。

これらのエスケープシーケンスの1つを使用した例:行3、列(文字)9にカーソルを置きたいとします。そのために、

\[033\[3;9H]

(列0が最初の位置であると仮定しているため、8番目の文字になります)。

ソース: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html (6.2も参照)

より一般的な読書: http://ascii-table.com/ansi-escape-sequences.php

ウィキペディア: https://en.wikipedia.org/wiki/ANSI_escape_code

25
TheWanderer

これらは端末の制御コマンドです。

ターミナルはもともと ややダムデバイス シリアルポートに接続されていて、現在のメニューを備えた派手なマルチタブ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(およびその他の文字)があります。これは 潜在的に陽気な効果 です。

13
ilkkachu

これらは ANSIエスケープコード と呼ばれ、 console_codesのマニュアルページ にリストされています。これらはBash固有ではありませんが、ターミナルがサポートしている限り、どのコンソールアプリケーションでも動作します(ほとんどのターミナルエミュレーターはサポートしています)。

7
Joey Marianer

エスケープとそれに続く右角括弧 escape_]_ オペレーティングシステムコマンドを導入するために使用されますOSC)。

ECMA-48 にあり、xtermが使用する制御シーケンスの概要を XTerm Control Sequences で読むことができます。 、たとえば、端末ウィンドウのタイトルを変更するため。

エスケープシーケンスは、異なる文字で開始できます。 XTermの制御シーケンスの C1(8ビット)制御文字 セクションでは、それらのいくつかに言及しています:CSI(これは escape[APCDCSPM。異なる(2番目の)文字の理由は、ペア(エスケープと _]_)は、異なるタイプのエスケープシーケンスに使用される1バイトの制御文字に関連付けられています。

仕様を読むと、CSIが文字列を許可しているのに対し、OSCが数値パラメーターを持つコントロールに使用されていることに気付くでしょう。構文だけでなく、この規格を作成した委員会は、APCおよびPMとは異なるDCSおよびOSCの使用を念頭に置いていました。

6
Thomas Dickey

他の回答で説明されている「エスケープシーケンス」は、使用している端末タイプ(ほとんどの場合「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」のため)。

1
Hannu