PS1 问题,搞乱 CLI

yay*_*ayu 16 command-line bash ps1

我做了一个简单的 PS1 作业

PS1="\e[0;31m[\W]\$ \e[m "
Run Code Online (Sandbox Code Playgroud)

我想要做的就是更改提示颜色并仅显示相对路径。但是,这会弄乱 CLI。例如,当浏览历史时,?它会裁剪并重叠显示。当我键入一个长命令时,光标移动到与提示显示本身重叠的屏幕的开头。我做错了什么?

gei*_*rha 31

那是因为 bash 认为提示比它长。\e[0;31m例如,转义序列被终端吸收,进而将以下文本变为红色,但 bash 不知道这一点。因此,您必须告诉 bash 该字符序列不应计入提示的长度,您可以通过将其包含在\[ \]. 我还建议使用 tput 而不是硬编码终端转义序列。

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅BashFAQ 53终端代码 (ANSI/VT100) 介绍

  • +1,这里也一样。对于那些盲目测试此解决方案并且它不起作用的人,这里值得一提的是,BashFAQ 链接中描述了另一种用于在函数内转义颜色的语法“\001 \002”。 (2认同)