if子句的提示自訂問題

if子句的提示自訂問題

我最近稍微調整了一下我的 PS1。程式碼如下:

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

缺失的字元來自書呆子字體在我的問題(以及assemble_prompt功能)中並不重要。

我遇到的問題是,當我將終端機視窗大小縮小到提示符號大小(大約)時,PS1 會損壞。然後它似乎忽略 PS1 設定並將 PS1 設定為$僅字元(請參閱螢幕截圖)。請注意,當我開始輸入時,它只會覆蓋我的自訂提示。

PS1 瘋了

我將問題縮小到 if 子句,如果上一個命令不成功,則添加“fail”字元。如果我刪除該部分,一切都會按預期進行。

有沒有辦法保留if子句部分,但修復視窗尺寸太小時 PS1 重置的問題?

PS 我使用rxvt-unicode作為我的終端,但問題仍然存在於所有其他終端中(經過測試xtermst)。

答案1

您可能想要將終端控製程式碼括起來,\[...\]以告訴 Bash 它們實際上並未列印字元。否則,當它們嘗試計算提示符的寬度時,會使 shell 感到困惑。

所以使用"\[\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.

相關內容