Bash

為什麼這個 PS1 值會導致意外行為?

  • June 10, 2017

可能重複:

為什麼當我瀏覽歷史記錄時我的 bash 提示會被竊聽?

我已將PS1變數設置.bashrc為以下內容:

PS1='\e[35m[\W]:\e[0m '

它達到了預期的目的(更改在cwd內部[]和之前顯示的提示的顏色:),但是當我搜尋我的命令歷史記錄時,有時我循環的部分命令會附加到提示中。例如:

[~]: echo "something"
something
[~]: date
Sun Nov 18 17:07:54 PST 2012
[~]: sudo apt-get install vim
...

現在,假設我想返回我的echo "something"命令,我按下並得到

[~]: sudo apt-get install vim

我再次按下並發生這種情況

[~]: sudo apt-date

又起來了

[~]: sudo apt-echo "something"

如果我通過按退格鍵刪除命令行上的所有內容,它會一直刪除到

[~]: sudo apt-

它對命令沒有影響。例如,該行[~]: sudo apt-date仍會列印dateetc 的輸出。為什麼會發生這種情況,如何在沒有副作用的情況下實現所需的提示?

發生的事情是 Bash 對提示符中的列印字元數感到困惑。它將游標定位序列發送到終端以正確定位游標以執行命令歷史記錄等。在列印提示後,它需要很好地了解游標的實際位置。

嘗試將提示設置為:

PS1='\[\e[35m\][\W]:\[\e[0m\] '

它現在應該按預期工作。

\[and對告訴 Bash,它們之間的\]內容是非列印轉義序列,實際上不會向前移動游標。然後它將正確猜測游標位置並在瀏覽命令歷史時進行適當的替換。

此資訊可在 info 節點中找到(bash)Printing a Prompt

**編輯:**在較新版本的 bash 中,這已更改為(bash)Controlling the Prompt.

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