これは〜/ .bashrcから来ました
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
\033[01;32m
に注意してください
\033[
が制御シーケンスの紹介者であることを私は知っています。 32
が緑のカラーコードであることは知っています。
しかし、01;
とm
は何ですか?
ANSIエスケープコード のどの部分に\033[01;32m
が属しているか。
読むべき標準はECMA-35とECMA-48です。 (「ANSI」は主に誤った名称です。この場合の「VT100スタイル」も同様です。)これらは、制御シーケンスには4つの部分があることを説明しています。
Control Sequence Introducerは、いわゆるC1制御文字の範囲にあり、その値はU +0080からU + 009Fです。
1980年代半ばまでに、端末とシリアル通信の世界はほぼ完全に8ビットクリーンになりました。これは主に、パーソナルコンピュータ、BBS、Fidonetなどの世界からの選択圧のおかげです。1970年代にフィッティングしたときECMA-38とECMA-45は、値が7ビットに収まらないC1制御文字用の代替7ビットエンコーディングのシステムを提供しました。これは、約40年後、エスケープ文字(␛
)で化石化されたままであり、その後に[
がCSIの7ビットエンコーディングです。
すべてのC1範囲に代替の7ビットエンコーディングがあることがわかります。また、これを知らない人もたくさんいます。 actual CSI文字を制御シーケンスイントロデューサーとして認識しないソフトウェアがあります。すべての7ビットエンコーディングを処理するわけではなく、Control SequenceIntroducer用のソフトウェアのみを処理するソフトウェアがあります。一方、1980年代半ばに追いつき、実際のC1制御文字を認識するソフトウェアがいくつかありますそうでない場合でも 7ビットでエンコードされています。
したがって、特定の制御シーケンスを分解すると、次のようになります。
\033[
—エンコーディングのエンコーディング、CSI文字の7ビットエンコーディングさらにエンコード Bourne AgainShellによって処理されるCスタイルのエスケープシーケンスとして01;32
—5つのパラメーター文字m
—最後の文字(おそらくない)中間文字と最後の文字の組み合わせは、制御シーケンスの機能を指定します。ベンダー拡張用に予約されているセット全体を含め、そのような機能はかなりたくさんあります。 (シーケンスを制御するための前述の構造により、未知のベンダー拡張もストリームで処理/スキップできます。)この場合に示されるのはグラフィックレンディションの設定(SGR)、標準制御の1つです。シーケンス。
パラメータ文字は、10進数でセミコロンで区切られた数値パラメータの文字列をエンコードします。 (実際には、パラメーター文字列にはそれ以上を含めることができます。コロンは正当なパラメーター文字です。結局のところ、値はU + 003Aです。後のITU標準では、サブパラメーターを示すために使用されます。これは実際にはSGRに適用できます。同様に、DECVTはパラメータ文字U + 003F、?
を、標準制御シーケンスの一部のDECバリアントの拡張マーカーとして使用します。)SGRの場合、これらのパラメータは印刷出力に設定する色と属性(つまり、「グラフィック」文字の「レンディション」)。
これらの広範なセットがあり、この特定の場合、それらは次のことを意味します。
01
—太字32
—緑の前景ここでは、IBM PCのCGAディスプレイシステムと、IBM PC互換機を端末として使用することで、太字などのフォントの太さが色の変化に変わる方法について、まったくの逸脱があります。これは、幸いなことに徐々に消えていきました。太字のは、実際にはもう一度太字を意味します(CGA以前の時代の意味です)。この規則の下で、したがって一部の、しかし幸いなことにますます少なくなる端末エミュレーターでは、このSGRシーケンスは、前景として色#10、明るい緑を効果的に設定します。
何年も前に、AIXtermターミナルエミュレータは、前景色と背景色として色9から15を設定するために、SGR 90から97および100から107を導入しました。その16色の規則が現在普及しているだけでなく、256カラーパレットの規則もかなり長い間ありました。前景色#10を取得するためのより信頼性の高い方法は、SGR 92、not SGR 1; 32を使用することです。
これは一般的にシェルプロンプトの必要性ではないことに注意してください。例:Cスタイルのエスケープを使用して特定の制御シーケンスを直接エンコードするのではなく、Zシェルを使用すると、ユーザーはPS1
、RPROMPT
、およびさまざまなプロンプト用の同様のシェル変数。 Zシェルは、terminfoデータベースで対応する制御シーケンスを検索します。したがって、Zシェルの同様のプロンプト文字列は次のようになります。
PS1 =%B%F {green}%n @%m%f%b
PS1 =%F {10}%n @%m%f
最後に:これらはnot "VT100スタイル"です。 VT100は、一般化として人々に頻繁に取り上げられています。これは正しくありません。これらはECMA-48制御シーケンスであり、「VT100スタイル」ではありません。ここで重要な事実は、初心者にとって、VT100 はモノクロであり、マルチカラー機能を備えていなかったことです。この名前として「vt100」または「vt102」のいずれかを悪用するという悪い習慣に陥らないでください。
私が見つけた調査に基づいて:
\033[01;32m
— \033[01;32m
が属するANSIエスケープコードの部分はと呼ばれますグラフィックレンディション(SGI)ターミナル出力シーケンスを選択します(コードはCSI n m
です)。\033[
—は制御シーケンスイントロデューサーです01
—「太字または強度の増加」のコードです。;
—コードの区切り文字です。 コードはいくつでも持つことができます。ウィキペディアのページにそれらのコードの表があります ANSIエスケープコード atSelect Graphic Rendition(SGR)パラメータ。32
は、前景の緑色のテキストのコードです。m
は、シーケンス全体をCSI n m
SGIシーケンスとしてマークします。