如果输出不以换行符结尾,则彩色 bash 提示会覆盖上一个命令的输出

Edd*_*ied 5 bash command-line colors prompt

在我的系统上,当使用彩色提示时,如果输出的最后一个字符不是换行符,则上一个命令输出的最后一行将被覆盖。

例如:使用默认的非彩色 bash 提示符,我们有:

[myusername@myhostname 目录名]$ echo -n foo-bar
foo-bar[myusername@myhostname 目录名]$

这是预期的。

但是,使用以下彩色提示:

PS1='\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '

我们有(此处显示没有颜色):

myusername@myhostname:~/path/to/dirname$ echo -n foo-bar
myusername@myhostname:~/path/to/dirname$ rname$ 

光标现在位于行中的最后一个“r”。在提示符下键入一些字符会覆盖最后一个“rname$”。最终结果是,如果前一个命令的输出没有以换行符结尾,我就看不到它是什么。这是最重要的事情要解决。额外字符出现的方式,但过度写入,并不会打扰我,但也很好修复。

我已经尝试过使用来自 bash 文档的其他彩色提示,以及来自其他超级用户关于彩色提示的答案的一些彩色提示,它们的行为方式完全相同。

$ bash --version
GNU bash,版本 3.1.17(1)-release (x86_64-redhat-linux-gnu)
版权所有 (C) 2005 Free Software Foundation, Inc.

不确定,但我认为是CentOS,不知道是什么版本。给我一个命令来检查操作系统,我会运行它。

小智 5

我的首选解决方案是让提示始终以换行符开头。这样我在最后一个命令输出之间总是有一个空行(当然,在这种情况下除外),这对我来说感觉更自然。最糟糕的情况是,我没有像您看到的那样覆盖文本,而是在两者之间没有空行。除非您尝试了一段时间并且根本无法忍受空行,否则我强烈推荐它。

PS1='\n\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '
Run Code Online (Sandbox Code Playgroud)

一个额外的建议,如果你愿意的话:我还使用多行提示使我的命令行尽可能长,然后再换行(或者滚动,如果你的终端或 shell 是为此配置的)。我也想知道历史行号。两人在一起:

PS1='\n\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m \!\]\n\$ '
Run Code Online (Sandbox Code Playgroud)

最后,我还喜欢在运行命令之前和之后打印时间戳。我使用的简化版本是:

export PROMPT_COMMAND="date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap 'date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap DEBUG' DEBUG"
Run Code Online (Sandbox Code Playgroud)

头晕了吗?:)

  • 这巧妙地回避了 OP 的问题,但它并没有*解决* OP 的问题——考虑到该问题在 OS X 系统上无法重现,这值得调查([1](http://superuser.com/questions/440408/colorized -bash-prompt-overwrites-previous-commands-output-if-the-output-doesnt#comment509354_440408), [2](http://superuser.com/questions/440408/colorized-bash-prompt-overwrites-previous-例如,commands-output-if-the-output-doesnt#comment509680_440408))(在你的身上吗?)。 (3认同)