PS1でecho -eを使用すると、シェルで改行の問題が発生します。

PS1でecho -eを使用すると、シェルで改行の問題が発生します。

質問:

コマンドラインプロンプトを開きます。

ここに画像の説明を入力してください。

文字を数回入力してください。

ここに画像の説明を入力してください。

入力したテキストは新しい行に改行されず、同じ行に改行されます。

ここに画像の説明を入力してください。

今bを押してください。 2番目にラップする必要がある場合は、新しい行でラップされます。

ここに画像の説明を入力してください。


この動作の原因は何ですか?

このようにPS1を使用すると、次のような動作が発生します。

ps1Color="\033[1;35m"
export PS1='$(echo -en $ps1Color) Baz $'

色を直接使用する代わりにエコーを使用したいのは、前のコマンドの終了状態に応じて条件付きで色を追加したいからです。

色を直接使用すると、この動作は発生しません。


私の質問は次のとおりです

  • PS1のカラーコードを印刷する方法エコを使う
  • PS1が条件付きで別の色に変わるようにするための最良の方法は何ですか?
  • この動作が現れるのはなぜですか?

修正する

明らかに色を変更したいので、echoを使ってこれをやりたいと思います。ホームフレーズ

これが私が今持っているものです:

function setPs1Colors_start () {

    local previousExit=$?

    local ps1Color="\033[1;35m"
    local ps1FailBackground="\e[41m"

    echo -en $ps1Color

    if [[ previousExit -ne 0 ]]
    then
        echo -en $ps1FailBackground
    fi

}

function setPs1Colors_end () {
    local ps1DefaultColor="\033[0m"
    echo -en $ps1DefaultColor
}

export PS1='$(setPs1Colors_start)[$(date +%b\-%d\ %k:%M)][$(versionControlInfo)\W]\$$(setPs1Colors_end) '

答え1

\033[1;35m7文字です。bashこの7つの文字が実際にnull幅を持っていると推測する方法はありません。それ以外の場合、幅は7列と見なされます。

編集キーを使用すると、カーソル位置の順序(上、下、左、右)を使用してカーソルを移動するため、このエディタ(またはreadline使用するデフォルトの行エディタ)は画面の現在の位置を知りたいです。

したがって、プロンプトのどの文字がカーソルを動かさないのかを知らせる必要があります。これbashはitを使用して行われ\[...\]、これは内部幅が0であることをシェルに伝えます。

また、プロンプト拡張はESC文字をbash認識するため、\e使用する必要はありませんecho -e。次のことができます。

PS1='\[\e[1;35m\] blah $ '

echo、またはより良いまだ使用する必要がある場合は、次の手順をprintf実行します。

PS1='\[$(if ...; then printf "$color1"; fi)\] blah $ '

または:

PS1='$(if ...; then printf "\[$color1\]"; fi) blah $ '

ではzsh's と同じですが、文字属性を変更する手順があるので、次のようにすることをお勧めします。bash\[...\]%{...%}tcshzsh

PS1='%B%F{magenta}blah $ '

太いマゼンタの前景に使用されます。また、onを含むいくつかの形式の条件付きテストがあるため、ifエラー、緑のelseは次のよう$?red書くことができます。

PS1='%F{%(?:green:red%)}blah%f $ '

tcshはい%B、しかしそうではありません%F{color}。したがって、次のものを使用できます。

set prompt = '%{\e[1;35m%}blah $ '

ksh88または では、pdksh次の操作を行います。

PS1=$(printf '\5\r\5\33[1;35m\5blah $ ')

これは文字(ここでは0x5)を定義します。脱出する特徴。次に、その間にテキストを含めて、シェルに表示されないことを通知します。 0x5以外のすべての文字を使用できますが、プロンプトには表示されず、シェルが実際に(CR文字で)書き込むため、mkshを除く端末では無視する必要があります。

ksh931つのカーソル位置決め順序のみを使用してください(BSカーソルを左に1列移動)。右に移動するには、同じ文字を再描画します。したがって、カーソル位置を知る必要はなく、入力された各文字の幅だけを知るだけです。端末が端を囲む限り動作します(それで正しく動作しません)。terminator例えば)。制御シーケンスを含むプロンプトが表示された場合、1つの副作用はタブストップが正しく整列されないことです。

関連情報