if 句によるプロンプトのカスタマイズの問題

if 句によるプロンプトのカスタマイズの問題

最近、PS1 を少し調整しました。コードは次のとおりです。

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

不足している文字はオタクフォント私の質問では(機能と同様にassemble_prompt)問題ではありません。

私が遭遇した問題は、ターミナル ウィンドウのサイズをプロンプトのサイズ (おおよそ) に縮小すると PS1 が壊れてしまうことです。その後、PS1 設定は無視され、PS1 は$文字のみに設定されるようです (スクリーンショットを参照)。この場合、入力を開始すると、カスタム プロンプトが上書きされることに注意してください。

PS1は大騒ぎになった

問題は、前のコマンドが失敗した場合に「fail」文字を追加する if 句に絞り込まれました。その部分を削除すると、すべてが期待どおりに動作します。

ifウィンドウ サイズが小さすぎる場合に、句の部分を保持しながら PS1 リセットの問題を修正する方法はありますか?

PS をrxvt-unicode端末として使用していますが、他のすべての端末でも問題は発生します (テスト済みxtermst)。

答え1

端末制御コードを囲んで、\[...\]実際には文字を印刷していないことを Bash に伝えるとよいでしょう。そうしないと、プロンプトの幅を数えようとしたときにシェルが混乱してしまいます。

だから を使用してください"\[\e[91m\]xxx\[\e[0m\]"

からマニュアル:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

関連情報