为什么浏览历史时我的 bash 提示会被窃听?

kor*_*rda 80 bash prompt command-history

通常,当我开始查看命令历史时,显示的命令中的某些字符不会被删除,例如:

发生了什么:

prompt$ some_command
prompt$ some_commanother_command
Run Code Online (Sandbox Code Playgroud)

应该发生的事情:

prompt$ some_command
prompt$ another_command
Run Code Online (Sandbox Code Playgroud)

我无法擦除这些字符,bash 在执行命令时会忽略它们。当显示新提示时(Enter例如按下后),它们也会消失。

我问过我工作场所的其他在 Linux 上工作的人,他们说他们有时也有这个问题,但他们不知道如何解决这个问题。

我有 Ubuntu 11.10,我正在使用 guake。这是我的PS1

\e[0;31m\u \A ${PWD##*/}\e[0;32m$(parse_git_branch)\e[0;31m$\e[m
Run Code Online (Sandbox Code Playgroud)

这里parse_git_branch

parse_git_branch () {
    git name-rev HEAD 2> /dev/null | sed 's#HEAD\ \(.*\)# (\1)#'
}
Run Code Online (Sandbox Code Playgroud)

据我所知,即使 PS1 不那么“花哨”,我的同事也有这个问题。

cho*_*oba 88

\[...\]在 PS1 的长度为 0 的部分周围使用。它有助于 bash 获得正确的提示长度。即使采用这种措施,在使用多字节字符时,您的命令行也会被破坏(至少我的如此)。Ctrl+L在这种情况下,击打也有帮助(但同时清除屏幕)。

  • 是否有 bash 错误报告?这是一个浪费了我太多时间的错误,一般来说应该是可以修复的(没有“PS1”黑客)。 (6认同)
  • 我修改了我的 bashrc,现在我有 `PS1="\\[\e[0;31m\\]\u \A \${PWD##*/}\\[\e[0;32m\\]\ $(parse_git_branch)\\[\e[0;31m\\]$\\[\e[m\\] "`. 当我看着它时有点难以理解,但它似乎有所帮助。 (4认同)
  • @NikosAlexandris:一开始,`\e[0m` 没有包含在 `\[...\]` 中。 (2认同)

小智 11

您需要确保转义所有不可打印的字符。

好的

PS1="\[\e[36m\]\W ? \[\e[m\] "
Run Code Online (Sandbox Code Playgroud)

坏的

PS1="\[\e[36m\]\W ? [\e[m\] "
Run Code Online (Sandbox Code Playgroud)