Bash

終端提示未正確換行

  • November 14, 2021

我有一個問題,如果我在 bash 中輸入很長的命令,終端將無法呈現我正在正確輸入的內容。我希望如果我有如下命令:

username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com

該命令應呈現在兩行上。相反,它通常會環繞並開始在我的提示頂部寫入,有點像這樣:

myreallylongusername@something.somelongserver.comh -i /path/to/private/key

如果我決定返回並更改某些參數,則不知道游標會出現在哪裡,有時會出現在提示符的中間,但通常會出現在我正在輸入的行的上方。

當我Up執行上一個命令時,會發生額外的樂趣。我在 gnome-terminal 和 terminator 以及 i3 和 Cinnamon 上都試過這個。有人建議這是我的提示,所以這裡是:

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]

Ctrl``l, reset, 並且clear都按照他們說的做,但是當我重新輸入命令時,或者Up同樣的事情發生了。

我檢查並checkwinsize在 bash 中啟用。這發生在 80x24 和其他視窗大小上。

這只是我學會忍受的東西嗎?有什麼我應該知道的魔法嗎?我已經決定只使用一個非常簡短的提示,但這並不能解決問題。

不可列印的序列應包含在\[\]中。看看你的PS1,它後面有一個未封閉的序列\W。但是,第二個條目是多餘的,它重複了前面的語句*“1;34”*。

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                 |_____________|               |_|
                        |                       |
                        +--- Let this apply to this as well.

因此,這應該具有預期的著色:

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                              |_____|
                                 |
                                 +---- Bold blue.

保持*“原始”*這也應該有效:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                 |_|         |_|
                                  |           |
                                  +-----------+-- Enclose in \[ \]

編輯:

該行為的原因是因為bash相信提示比實際更長。舉個簡單的例子,如果有人使用:

PS1="\033[0;34m$"
      1 2345678

提示被認為是 8 個字元而不是 1。因此,如果終端視窗是 20 列,在輸入 12 個字元後,它被認為是 20 並環繞。如果嘗試執行退格或Ctrl+u. 它停在第 9 列。

但是,除非在最後一列上,否則它也不會開始新行,因此第一行被覆蓋。

如果繼續輸入,則該行應在 32 個字元後換行到下一行。

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