Ansiエスケープシーケンスを使用してxtermの色を変更するにはどうすればよいですか?


25

コマンドラインからxtermの色(背景、フォント、前景)を変更したいと思います。これはANSIエスケープシーケンスを使用して行うことができると聞きました。

これが可能な場合:

  • どうやって?
  • 色の名前を使用できますか、またはRGBコードを使用する必要がありますか?

回答:


27

ANSIエスケープシーケンスは、エスケープ文字である文字27で始まる文字のシーケンスで構成されています。次の文字は、多くの場合(常にではありませんが)角かっこです:[

echoコマンドは、エスケープに指定-eして使用する場合、エスケープ文字を送信できます\e

ANSI規格では、8色とブライトモードが定義されており、合計16の可能性があります。シーケンスは次のとおりです。

\e[<number>m

次の<number>いずれかです。

前景:

  • 30ブラック
  • 31赤
  • 32緑
  • 33イエロー
  • 34ブルー
  • 35マゼンタ
  • 36シアン
  • 37ホワイト

バックグラウンド:

  • 40ブラック
  • 41赤
  • 42緑
  • 43イエロー
  • 44ブルー
  • 45マゼンタ
  • 46シアン
  • 47ホワイト

  • 0すべてリセット

  • 1太字

したがって、前景を赤、背景を黄色にするには:

$ echo -e "\e[31m\e[43m"

そして太字を有効にするには:

$ echo -e "\e[1m"

もちろん、それらをすべて組み合わせることができます。

$ echo -e "\e[31m\e[43m\e[1m"

他のことを行うための他の多くのエスケープコードがあります。

たとえば、画面をクリアし、カーソルを左上に移動します。

$ echo -e "\e[2J\e[1;1H"

色を変更するときに便利です:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

色が変わり、画面がクリアされ、左上にカーソルが置かれます。まあ、ほぼ左上。Echoはキャリッジリターンを挿入するため、1行下に移動します。-nうるさい場合は、エコーを追加してこれを防ぐことができます。

あなたがそれをすべて台無しにし、あなたが入力しているものを見ることができないなら、あなたは押すことによって、ターミナルの色を通常にリセットすることができます:

Ctrl+v [ 0 m Return

あなたが望むのはコマンドプロンプトです。未知のコマンドについてうなりますが、あなたは再び何をしているかを見ることができます。


カラーコードの代わりにカラー名を使用できますか?
ネイサンフェルマン

1
いいえ。ただし、色コードを変数に割り当てることができます。FGRED = 31; エコー-e "\ e [$ {FGRED} m"
Majenko

3
ただし、複数のカラーコード番号は「;」で区切ることができることに注意してください。したがって、前景を赤に、背景を黄色にするecho -ne '\e[31;43m'には、(上記の代わりにecho -e "\e[31m\e[43m")短いものを使用することもできます。
アンドレアススピンドラー

カーソルの色を34ブルーに変更するにはどうすればよいですか?
trusktr 14年

28

最新のXtermは32ビットカラーをサポートしていることに注意してください!

簡単な例。値#53186fの素敵な濃い紫色の背景(それぞれ、彼自身のもの)を設定するには、次のようにします。

echo -ne "\033]11;#53186f\007"

これにより、後続のテキストだけでなく、ウィンドウ全体の色が即座に変更されることに注意してください。これは、たとえば、サーバーにsshした後にウィンドウを明らかに異なるものにする場合に特に便利です。上記の「エコー」を.bashrcに入れると、そのサーバーにログインすると端末の色が自動的に変更されます(ただし、Ctrl-Dを押したときに元に戻りません)

あなたはこれを探してネット上で何時間も過ごすことができます-ほとんどのドキュメントは、オリジナルの16 ANSIカラーについてのみ話します。

ソース:http : //www.steike.com/code/xterm-colors/ およびhttp://rtfm.etla.org/xterm/ctlseq.html(「オペレーティングシステムコントロール」の下を参照

注:上記のエスケープシーケンスはXTermsで有効であり、XTermのように見える「XTermのような」ウィンドウターミナルエミュレータの他の実装では機能しない場合があります。たとえば、「gnome-terminal」または「konsole」には異なるエスケープシーケンスがあるか、色の変更がまったく実装されていない場合があります。


1
これは私にとってはうまくいきません。端末に目に見える変化がない空白行をエコーし​​ます。
リチャード

1
これは私にとっては
うまくいきました

1
+1はウィンドウの背景を変更し、「#00ff00」ではなく「green」のような色名を許可します。
ロブI

1
#53186f 32ビットカラーはどうですか。私は、24ビット...数える
jiggunjer

誰でもgnome-terminalで同じことを達成する方法を知っていますか?
-wjandrea

3

はい。ANSI端末はANSIエスケープコードをサポートしています。次の形式の各Control Sequence IntroducerCSI)コード:

ESC[<<<CODE>>>

アスキー文字27ESC文字)または1b16進数で、その後に左角括弧と、使用するアクションを示す文字が続きます。

;分離されたパラメーターのリストは、<<<CODE>>>パラメーターの直前に指定できることに注意してください。

現在、色はCSIコードのサブセットであるコードを使用していSelect Graphic Renditionます。これらは次の形式です。

ESC[<<<SGR>>>m

SGRコードは、パラメータとして渡されますCSI。あなたの質問に関連するのはSGRコード30-49です。コード30〜39は前景色を設定します。コード40〜49は背景色を設定します。

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

コード38と48は特別なコードです。これらは、RGB値を使用できるようにするものです。これらの形式は次のとおりです。

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

注:別の用途にはが含まれます\x1b[<3 or 4>8;5;<web safe color index>m。この使用法では、まったく異なるカラーエンコーディングがあります。詳細については、この回答の上部にあるリンクを参照してください。

コード39および49は、前景色と背景色をデフォルトに設定します。デフォルトは、端末ごとに定義されています。

実際には、色30〜37、40〜47は、ラベルが示す色とわずかに異なります。

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

明るい色を得るには、太字のSGIを使用します1。太字は誤解を招く名前です。フォントを太字にしません。実際にテキストの明るさを増加させます。ボールドを適用すると、色は次のようになります。

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

注意:色の最後の2つのブロックは、前面と背景の両方に関連しています(<index> + (30 or 40))。

すべてのスタイルを削除するには(デフォルト/通常モードに戻す)、SGR0を使用します。

CSIコードはすべてグラフィカルではありません。たとえばESC[2J、端末をクリアします。ESC[<y>;<x>Hカーソル位置を設定します(1-indexed)。詳細については、ウィキペディアの記事を参照してください。

注:これらをテストするには、echo -eまたはを使用しますprintf


2

注:「^ [」はエスケープ文字であり、CTRL-V、CTRL- [で挿入されます。^ Gはベル文字で、CTRL-V、CTRL-Gで挿入されます

次のブロックは.bash_profileにあり、色を変更した可能性のある別のシステムにログオンした後でも、このシステム上のxtermが常に白地に黒になるようにします。

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

また、ここで はubuntu用のパッケージを備え たbashスクリプトで完全に作成されたプロジェクトScriptEchoColorを確認し ますが、方法を知っていればこれらのスクリプトを任意のディストリビューションにインストールできます(最新のgitからもダウンロードできます)。


次のような短縮色名または拡張色名を使用できます。

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

サンプル: ここに画像の説明を入力してください

また、xtermを(文字だけでなく)それ自体でより広範囲に制御するために、xtermcontrolを必ず確認してください。


0

多くのANSI CSIコードには、SGRまたはSelect Graphic Renditionと呼ばれるものがあります。これはESC、、[parameters、mで、パラメーターはセミコロンで区切られたASCII形式の1つ以上の整数です。多くの異なるSGRパラメーターが上記のウィキペディアのページにリストされています(ただし、すべてのパラメーターの詳細は説明していません)。

1(太字または輝度増加)や31(赤のテキスト)などの一部のパラメーターはスタンドアロンであり、標準の赤と太字の赤の前景テキストをそれぞれ、ESC[31mまたはそのESC[1;31mように個別に使用するか、組み合わせて使用​​できます。

他のパラメーターは、パラメーターの後に、セミコロンで区切られた数値としてコードの後に​​単純に提供されます。したがって、たとえば、ESC[38;5;219m前景テキストを拡張色番号219でESC[38;2;150;100;50m表示し、RGB値38150、100、50 の色で表示します。この場合、「extended set foreground color」コマンドは、常に次のようになります。サブコマンド。サブコマンド2は、赤、緑、青のコンポーネントの値の3つのパラメーターを取ります。別の方法として、サブコマンド5はもう1つだけの値を取ります。0〜255の数値は、端末が構成されているテーブルの色を指定します。

次のシェル関数は、これらのコードを使用するのに便利です。

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

次のように使用できます。

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

パラメーターを指定しない場合sgr()、デフォルトはSGRコード0になります。つまり、すべての属性がオフになり、テキストがその端末のデフォルトにリセットされます。


1
技術的にはこれらのESC[38... mそしてESC[38... m缶/べき(情報のソースに依存-究極の1があること、私は、信じてitu.int/rec/T-REC-T.416-199303-Iこと)、を使用する必要がありますそれ以外の場合は、文字予約:(分離するパラメータ要素をことを)ので、;唯一の完全な間で使用されるパラメータ文字列 -つまりはESC[38;2;150;100;50m記述する必要がありますESC[38:2::150:100:50m...
SlySven

...残念ながら実装はしばしば忘れ色空間ID2150-無一つとして、私が知っていること、これまでに定義されているそこに行くべき値空のデフォルトが使用されるべきである-しかし、それは多くの場合、オフ逃していますまた;、セパレータとしてのみ使用すると、仕様に従って情報を確実に処理することができなくなります。
SlySven
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.