為什麼這個 bash 提示符號在滾動歷史記錄時有時會保留先前命令的一部分?

為什麼這個 bash 提示符號在滾動歷史記錄時有時會保留先前命令的一部分?

我承認我的 bash 提示符號是從幾個地方偷來的並拼湊在一起的,當使用向上/向下箭頭滾動 bash 歷史記錄時,有時會添加部分先前命令的長度。

例如,如果我之前的命令是:

ls
cd /home/caleb
vim .bashrc

當我按照提示向上滾動兩次時,它可能看起來像:

$ vim .bcd /home/caleb

其中前五個字元是上一個指令剩下的。

有誰知道為什麼會發生這種情況以及如何阻止這種情況?

我的提示是用以下程式碼設定的(太長了才能包含在此):https://gist.github.com/1679352

答案1

某個地方你的提示符是 fubar。通常發生的情況是,您的 shell 認為它正在輸出不可列印的術語代碼並期望它佔用空間。我能給您的最好建議是系統地添加(或刪除)您的提示,直到此行為停止以隔離導致此問題的程式碼。

答案2

顏色代碼需要用方括號括起來。括號告訴 bash 不應列印所包含的文本

以 @Pheditor 的範例為基礎,這表示在換行符之後完成的任何格式化都會導致原始問題:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

將格式程式碼包裝在 [] 中可確保永遠不會發生煩人的行為:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

文件:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

由於 PS1 格式導致值太長且難以閱讀,因此我將格式代碼放入變數中:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

答案3

我遇到了同樣的問題,這與顏色定義有關。

就我而言,我有一個多行提示(為當前命令提供大部分空間,無論提示顯示的路徑長度如何)。

錯誤版本:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

好版本:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00m終止顏色。如果它位於新行 ( \n) 之後,則會阻止在終端機中正確重畫,從而用背景顏色覆蓋先前的命令。將其移到新線後面解決了問題。

(在 Mac OS 10.8 中使用終端)

答案4

我有這個問題。我檢測到什麼?

當 PS1 變數中有顏色時(例如: "\e[35m" ),它總是必須被 "\[" 和 "\]" 包圍(例如: "\[\e[35m\]" )。

當我按照這個規則在 PS1 中標記所有顏色時,它起作用了!

滾動 bash 歷史記錄不再有問題。

壞例子:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m";導出PS1

好例子:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e [0米\]”;導出PS1

相關內容