在调用/编辑命令时,将ANSI颜色转义序列添加到bash提示符会导致光标位置错误

Xaq*_*Xaq 13 bash ansi command-prompt cursor-position

如果我设置我的命令提示符,如:

export PS1='\033[0;33m[\u@\h \w]\$ \033[00m'
Run Code Online (Sandbox Code Playgroud)

提示的颜色将为黄色,"$"字符后面的所有内容都将是默认的终端颜色.这就是我的期望.但是,如果我回想起一个命令行并尝试编辑它,移动光标 - 如果命令行我正在尝试编辑,则移动光标 - UpArrow/Ctrl-A(设置-o emacs)或ESC K(设置-o vi)足够长,光标不位于命令的开头.键入Ctrl-A(设置-o emacs)或^(设置-o vi)不会将光标移动到我看到的屏幕上调用行的开头.类似地,尝试将光标定位到行的末尾(Ctrl-E或$,取决于)会导致将多个字符放置在看似行的末尾.看起来bash被我添加到提示符中的转义字符搞糊涂了.

che*_*ner 22

您需要将非打印字符括起来,\[ ... \]以便bash在计算提示的长度时知道忽略它们:

export PS1='\[\033[0;33m\][\u@\h \w]\$ \[\033[00m\]'
Run Code Online (Sandbox Code Playgroud)