web-dev-qa-db-ja.com

端末PS1に色を付けようとするときの行のバグの折り返し(非印刷文字をエスケープする場合でも)

ラップトップを接続せずに長時間作業している間に問題が発生したため、upowerを使用して現在のバッテリーステータスを表示する新しいPS1を作成しようとしています。私はほとんどそこにいます、色と折り返しの小さな(迷惑な)バグ(より正確には、ウィンドウの終わりが満たされたときに同じ行の先頭に文字が印刷されている/改行なし)。最初、私は間違いを犯したと思っていました(これまでにこのトピックで見たすべての以前の投稿のように)、印刷できない文字をエスケープするのを忘れていました(\ [\])しかし、私はどこにも見ることができません...そうでない場合、PS1のエイリアスと機能の複合化に関する既知の問題はありますか(または誰かが私がやろうとしていることを行うためのより良いアイデアを持っていますか) ?)?

これが私のPS1(「色付き用語」の部分)です。

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\](`battPer`)-\A:\[\033[01;34m\]\w\[\033[00m\]\$ '

そして、私の.bash_aliasesのbatPer関数(およびエイリアス)(以下のコメント):

batPer()
{
 percent=`upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E percentage | cut -d : -f 2 | cut -d " " -f 11 | cut -d % -f 1`
 plugged=`upower -i /org/freedesktop/UPower/devices/line_power_ACAD | grep -E "online: " | cut -d y -f 2` 

if [ "$plugged" = 'es' ] ; then
    echo -e "\[\e[0;92m\]$percent%\[\e[0m\]"
else
  if [ "$percent" -le 10 ]  ; then
     echo -e "\[\e[0;91m\]$percent%"
  else 
     echo -e "\[\e[0m\]$percent%" 
  fi
fi
 }
alias battPer='batPer'

(ラップトップのプラグを抜くとすぐにステータスが変化するため、line_power_ACADの値を取得しています-カットの-fとして「yes」から「y」を取得しているため、「es」をテストします。 .. eeerrr ...私は怠;です;)-次にテストします:プラグイン->緑の値、プラグインではない:すべての用語charのすべてが赤で、10%が色/白をリセットします。 PS1に関数自体を配置しようとしたときに問題が発生したため、最後にエイリアスを実行しています。

色の悪夢の長い夜から私を救ってくれてありがとう、混乱の真ん中に大きな間違いがあるなら申し訳ありませんが、私はそれらの行をあまりにも長く見てきました...

更新:申し訳ありませんが、最後のmodの後に.bashrcを入手するのを忘れてしまいました。\[\e[0;92m\]$percent%\[\e[0m\]の出力が の場合、さらに失われます。output1 そして、エスケープキャラクターを配置しない場合、それは問題ありません(緑色のパーセンテージ)-まだラップはありません...エスケープキャラクターをどこかにエスケープしていますか?!?

4

問題は(強調鉱山、 bashマニュアル から):

文字列がデコードされた後、promptvarsシェルオプションの値に応じて、パラメータ展開、コマンド置換、算術展開、および引用削除によって展開されます( Bash Builtins を参照)。

そのため、関数出力の\[は遅すぎて、制御コードが続くことをBashに伝えることができません。これを機能させるには、PS1を関数の出力で設定する必要があります。 Prompt_COMMANDを使用することをお勧めします:

Prompt_COMMAND='PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\](`batPer`)-\A:\[\033[01;34m\]\w\[\033[00m\]\$ "'

内部引用符が二重引用符であることに注意してください。したがって、PS1が設定されるたびに、関数出力が追加され、thenBashはPS1をデコードしますプロンプトを表示します。

補足:これにより、出力をecho -eする必要はありません。以前は、PS1文字列を展開した後、Bashが色を解釈していなかったため、色に対してそれが必要でした。これで、Bashは制御コードもデコードします。

3
muru