Bash行换行和历史滚动

5

我在使用bash提示符和换行时遇到了问题。如果我使用静态提示符

export PS1="test$ ";   ### Works perfectly

我可以在命令行中输入长行文本,它们能够正确地换行。在历史记录中上下滚动也能正常工作。 当使用动态提示时,例如:

export PS1="\u@\h(\W)$ ";    ### Long lines don't wrap at all

长行文本被打乱了。找到了一个解决方案,可以使长行正确换行。(http://hintsforums.macworld.com/showthread.php?t=17068)。

export PS1="\[\u@\h(\W)$ \]";  ### Long  lines wrap while typing, but not while scrolling up/down through previous commands

然而,当在命令提示符历史记录中向上/向下滚动时,行并不换行。我不知道如何用言语解释这种行为,但我会尝试 - 当我向上滚动(上箭头键)时,最后一个命令的一半被吃掉了,光标停在了行本应换行的位置中间。

这个问题有什么解决方案?

我记得在许多Linux发行版中,动态提示正常工作(这是在我的工作场所)。

敬礼,

JP


顺便提一下,在第三种情况下,PS1="\[\u@\h(\W)$ \]",我甚至不知道正确的术语是什么行为——它是否在滚动时换行,而我不希望它换行,或者它没有换行,而我希望它换行。虽然我对这个疯狂的显示感到困惑! - JP19
2
什么终端软件?PuTTY、gnome-terminal、xterm、Terminal.app?第二个例子是正确的,应该可以工作。第三个例子中的\[\]用于包装非打印序列,如颜色代码。 - Dennis Williamson
终端软件是Putty。谢谢建议,我会尝试的。 - JP19
1个回答

1
这个问题可能不是关于提示符本身,而更可能是终端仿真器的行为不当。
我使用这个bash提示符:
export PS1="\[\e[1;34m\]\u@\h:\W \t (\j) <\!>\n\$\[\e[0;00m\]"

实际上跨越两行显示,看起来就像这样:

aks@anywhere:sh 01:43:27 (1) <1017>
$ env | grep PS
PS1=\[\e[1;34m\]\u@\h:\W \t (\j) <\!>\n\$\[\e[0;00m\]

它可以完美地使用历史滚动,无论是使用CTRL-N、CTRL-P还是箭头键。

我在MacBookPro上的Terminal.app中使用xterm-color。


我已经忍受这个问题多年了,原因是我没有正确地通过重置颜色来结束我的提示。谢谢! - Robert Mark Bram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接