Bash

終端提示覆蓋目前行

  • September 12, 2019

我的終端提示行有問題。當行太長時,它會纏繞在同一行上,然後Up arrow使它看起來更糟。

我已經檢查了終端提示未正確換行,但看起來我顯然正在關閉所有方括號以顯示不可列印的字元。

這是我的 PS1:

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot) }\[\033[01;36m\]\u@\h\[\033[00m\]\033[01;34m\]\w\033[00m\][$(type __git_ps1 >/dev/null 2>&1 && __git_ps1 "(%s)")]

將此視為我的標準提示行

MELISC@work~/dev/bin_tools[((main))]

我能夠得到

assdasdasdasdasdadasdsadadasdaddasdadadasdadsadasdsa((main))] asdsadsadsadsadasdasdassdasdasdassdasdassdasdasdasdasdasdasdsadsad

我已經檢查過我的.bashrc

我有並且shopt -s checkwinsize應該自動檢查列

您已經完全否定了 Bourne Again shell 的想法,即在顯示命令歷史記錄並允許您編輯命令行時,已列印的內容以及必須擦除/重寫的內容。

將提示分解為多個部分:

  1. \[\e]0;\u@\h: \w\a\]— 非列印字元,正確封閉
  2. ${debian_chroot:+($debian_chroot) }——大概只列印字元
  3. \[\033[01;36m\]— 非列印字元,正確封閉
  4. \u@\h— 僅列印字元
  5. \[\033[00m\]— 非列印字元,正確封閉
  6. \033[01;34m\]— 非列印字元,未正確封裝,因此 Bourne Again shell 不知道它們是
  7. \w\033[00m\]— 列印字元和非列印字元的錯誤混合
  8. [$(type __git_ps1 >/dev/null 2>&1 && __git_ps1 "(%s)")] ——大概只列印字元

我之前已經給出過這個建議,但它也是適用於這裡的一般建議:

  • 為了您自己的理智,使用\e或始終使用。\033
  • 使您的\[\]嚴格匹配的非嵌套對。
  • 確保所有非列印序列都在\[和內\](相反,所有列印序列都不在)。

(這就是為什麼當我想要古怪的彩色提示時,我個人更喜歡 Z Shell 及其替代的提示擴展機制。它知道諸如此類%F{green}的東西不是列印序列,無需被告知;它還可以計算出正確的轉義序列來自terminfo,沒有硬連線。)

引用自:https://unix.stackexchange.com/questions/317734