bash PS1変数の設定

bash PS1変数の設定

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

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

質問がいくつかあります。

  • \[\e[32;1m\]これらとそしての違いは何ですか\e[32;1m?彼らは同じですか?
  • コマンドを実行した後export PS1はうまく機能しますが、20文字ほど入力すると、添付のように文字が上書きされます。これは何の問題ですか?
  • どういう意味ですかSTARTCOLOR(\e[40m)/ENDCOLOR(\e[0m)

付録

いくつかのテストを行った後、問題を解決するために次の変更がありました。つまり、\e形式を形式に置き換える必要があります\\[\e

Red="\\e[1;31m"    #-- not working
Red="\[\e[1;31m\]" #-- working

答え1

ヒントを設定するヘルパー関数があり、エスケープコード参照を見つけるのに時間を費やしたくないので、すべてのテキストカラー値をここにエンコードします。

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}\u@\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はすべてのテキスト属性をリセットすることを意味します。つまり、「デフォルトコンソールの色を指定してください」という意味です。

答え2

Bashのマニュアルから:

\[    端末制御シーケンスをプロンプトに含めるために使用できる非印刷文字シーケンスを開始します
\]    。

\[\]端末に転送されません。彼らはbashに彼らの間の文字が印刷されないと言います。それらがなければ、bash[32;1mは(例えば)エスケープ文字の後に続くシーケンスが画面上のスペースを占めないことを知りません。これは、省略するとプロンプトの長さが正しく計算されない理由を説明します。

$PS1問題は一貫性が低い(またはMarkdownのバグかもしれません)。括弧(文字のまま表示)だけでなく、文字通りのバックスラッシュの括弧シーケンスが必要です。

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

答え3

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

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

エスケープ文字は直接入力できる文字ではないため(Escキーは通常アプリケーションごとに異なる目的で使用されます)、bashはこれを引用するために '\ e'を使用します。

ANSIグラフィックモード設定コマンドを使用してテキストの色を変更します。

\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

関連情報