it-mure.jp.net

bashPS1のセットアップ

PS1を次のように設定しようとしています。

 Green = "\ [\ e [32; 1m \]" 
 Red = "\ e [0; 31m" 
 Purple = "\ e [0; 35m" 
 STARTCOLOR = "\ [\ e [40m \]" 
 ENDCOLOR = "\ [\ e [0m \]" 
 export PS1 = "$ STARTCOLOR $ Green\u @ $紫\ h $赤\ w $緑> $ ENDCOLOR "

そして、私はいくつかの質問があります。

  • 「[\ e [32; 1m]」と\ e [32; 1m」の違いは何ですか?同じですか?
  • 'export PS1'コマンドを実行した後は正常に機能しますが、約20文字を入力すると、添付したとおりに文字が上書きされます。これの何が問題になっていますか?
  • STARTCOLOR(\ e [40m)/ ENDCOLOR(\ e [0m)の意味は何ですか?

http://a.imageshack.us/img8/606/resultqm.jpg

追加

いくつかのテストの後、私は次の変更で問題を解決できるようになりました。つまり、「\ e」形式は「\ [\ e」形式に置き換える必要があります。

 Red = "\\ e [1; 31m"-機能していません
 Red = "\ [\ e [1; 31m \]"-機能しています
9
prosseek

プロンプトを設定するヘルパー関数があります。エスケープコードの参照を探すのにこれ以上時間をかけたくないので、すべてのテキストの色の値をコーディングしました。

function set_Prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\[email protected]\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

その後、次のことができます。

PS1=$( set_Prompt )

# Use '#' for root Shell
export PS1=${PS1}'$ '

unset -f set_Prompt

VT100端末コードを説明するリンクは次のとおりです。 http://www.termsys.demon.co.uk/vtansi.htm

\[-印刷されない文字のシーケンスを開始します
\]-印刷されない文字のシーケンスの終了

  • 「[\ e [32; 1m]」と\ e [32; 1m」の違いは何ですか?同じですか?

同じではなく、コンソールでシーケンスを出力しようとするのは\[\e[32;1m\]'. Without [] `である必要があります。

  • STARTCOLOR(\ e [40m)/ ENDCOLOR(\ e [0m)の意味は何ですか?

STARTCOLORは、背景を黒に設定することを意味し、ENDCOLORは、すべてのテキスト属性をリセットすることを意味します。つまり、「デフォルトのコンソールカラーを教えてください」を意味します。

12

Bashマニュアルから:

\[非印刷文字のシーケンスを開始します。これを使用して、端末制御シーケンスをプロンプトに埋め込むことができます。
\]印刷されない文字のシーケンスを終了します

\[\]は端末に渡されません。それらはbashに、それらの間の文字は印刷されないことを伝えます。それらがないと、bashは、エスケープ文字に続くシーケンス([32;1mなど)が画面上のスペースを占有しないことを認識できませんでした。これは、プロンプトの長さを正しく計算しなかった理由を説明しています。それらを除外しました。

あなたはあなたの質問にあまり一貫性がないことに注意してください(またはおそらくそれはMarkdownの単なる間違いです)。 $PS1には、角かっこ(文字通り表示される)だけでなく、文字通りの円記号と角かっこシーケンスが必要です。

\eで始まるエスケープシーケンスは、ターミナルエミュレータによって解釈されます。それらは Xterm制御シーケンス(ctlseqs) ドキュメントに文書化されています(他の端末エミュレーターはほとんど互換性がある傾向があります)。たとえば、\e[32;1mは太字と緑色の前景に切り替わります。 \e[40m背景色を黒に切り替えます。 \e[0mはデフォルトの属性を復元します。

最新の端末エミュレーターのほとんどは、ANSIエスケープコードを使用してディスプレイのさまざまな側面を制御できます。

ほとんどのANSIコードは、2文字のコードESC- [で始まります。これは、エスケープ文字(ASCII 10進数27)の後に、角括弧で囲まれた文字が続きます。このシーケンスは、CSIまたは制御シーケンスイニシエーターとも呼ばれます。

エスケープ文字は直接入力できる文字ではないため(Escキーには他の、多くの場合アプリケーション固有の用途があります)、bashはそれを参照するために「\ e」を使用します。

テキストの色を変更するには、ANSI Set GraphicsModeコマンドを使用します。

\e[<value>m

どこ <value>は、セミコロン(;)。通常、1つの値のみが使用されますが、太字の属性は色の属性と組み合わせて使用​​すると便利です。

Alexander Pogrebnyakの回答に記載されている値を見ると、セミコロンの前の0または1が太字かどうかを選択しています。

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

ここにコードの便利なリストがあります http://ascii-table.com/ansi-escape-sequences.php

3
dr-jan