15

我承认我使用了一个有点冗长的 bash 提示:

--(username)-(Wed April 01|12:00:00)--(~ $

最近,我有了一个好主意,将其更改为根据上一个命令的退出值,如果成功,则 () 的内部元素将是绿色的,如果失败,它们将是红色的。我得到了它的大部分工作(一些奇怪的退出状态会将颜色更改为其他颜色,但我可以接受),但是当输入一个多于一行的命令并导致终端滚动时,提示消失!当没有颜色时,我的提示工作正常,所以我猜这与我的颜色转义有关,尤其是我未闭合的 [,但我无法确定它。

#.profile
export PS1='--(\e[$((32-${?}))m\u\e[0m)-(\e[$((32-${?}))m\d\e[0m|\e[$((32-${?}))m\T\e[0m)--(\e[$((32-${?}))m\w\e[0m \$ '

提前致谢!

4

3 回答 3

42

听起来应该可以解决您的问题。

这似乎对我有用*

export PS1='--(\[\e[$((32-${?}))m\]\u\[\e[0m\])-(\[\e[$((32-${?}))m\]\d\[\e[0m\]|\[\e[$((32-${?}))m\]\T\[\e[0m\])--(\[\e[$((32-${?}))m\]\w\[\e[0m\] \$ '

*嗯,真的很export PS1='\u@\h:\w\$ '适合我

引用链接的帖子,答案在于在PS1 声明中的所有颜色序列周围添加\[ 和 \] :

在我为 PS1 获得以下值之前:

'\e[0;34m\h:\w [!]\$\e[0m'

这给了我以下形式的漂亮蓝色提示

主机名:工作目录 [命令号]$

但是,我遇到了与您相同的换行问题。解决方法是在 ANSI 转义符周围插入 \[ 和 \],以便 shell 知道不将它们包含在换行计算中。这导致 PS1 的值如下:

'\[\e[0;34m\]\h:\w [!]\$\[\e[m\]'

于 2009-04-01T18:45:48.257 回答
6

http://mywiki.wooledge.org/BashFAQ/053 - 我有一个漂亮的颜色提示,现在 bash 似乎不知道我的终端有多宽。线条不正确地环绕。

顺便一提; 供你参考; 这是我的PS1,看起来像这样:( 来源:lyndir.com替代文字

\[$reset$bold$green\]\u@\h\[$blue\] \W \[$red\]${?/#0/\[$green\]}\$\[$reset\]

请注意我如何将所有颜色代码放入其中$parameters以使其更整洁,但更重要的是,因为您应该使用tput它们来生成它们。看:

http://mywiki.wooledge.org/BashFAQ/037 -- 如何打印各种颜色的文本?

我在一个实用程序脚本中声明了我的颜色参数,该实用程序脚本由我的~/.bashrc(以及我编写的任何脚本)提供,称为bashlib.

最后一点;把你的PS1定义放进去~/.bashrc,不要这样做export。绝对没有理由将您的PS1定义添加到您从 shell 生成的任何和所有进程的环境中。

于 2009-04-01T19:21:46.187 回答
1

您似乎只是缺少转义符周围的开始和结束括号(在第一个 '\e' 之前和最后一个 'm' 之后):

PS1='--(\[\e[$((32-${?}))m\u\e[0m)-(\e[$((32-${?}))m\d\e[0m|\e[$((32-${?}))m\T\e[0m)--(\e[$((32-${?}))m\w\e[0m\] \$ '

如前所述, PS1 var 不需要导出:只有您的 shell 需要看到它。

于 2009-04-03T15:55:03.400 回答