使用 PS1 设置的彩色文本和命令的彩色输出相互混淆

使用 PS1 设置的彩色文本和命令的彩色输出相互混淆

PS1以一个开始颜色序列(如\[\e[0;32m\])结尾,使终端中的所有文本都着色(在本例中为绿色)。但是,当我使用诸如(在 my 中ls别名)之类的命令时,输出中的颜色有点混乱:第一个“彩色”单词为绿色,而接下来的无色文本为白色而不是绿色。ls --color=auto.bashrc

有没有办法在所有情况下都有干净的输出?当输出有颜色时,我可以使用白色作为“默认”文本颜色,但我希望它保持一致。

当然,我最想要一个能够自动应用于所有命令并且不需要我更改调用它们的方式的解决方案。

就我个人而言,我没有任何想法。也许可以做一些事情来“即时”在输出中搜索转义序列并执行一些替换?不过,我不知道如何实现这一点,特别是它是在“幕后”完成的。

答案1

原因是因为你做错了。

您说您的提示末尾有一个“开放”颜色序列。这是错误的。颜色不筑巢。没有“打开”和“关闭”之分。它是“切换到...”或“重置为默认值”(实际上是“切换到0”)。因此,当ls --color=auto完成某件事后切换颜色时,它将发出重置为默认值的序列。这不是“回到以前的样子”。

将终端设置为使用您想要“默认”的文本颜色(即调色板编号 0)。然后,如果您希望提示具有不同的颜色,请在开始时设置它并在结束时重置。

有关更多信息,请阅读 Bash 提示符 HOWTO第 6 章 ANSI 转义序列:颜色和光标移动文档。

答案2

正如之前所回答的,以PS1开场颜色序列作为结尾并不是一个好主意。这将使彩色命令的输出错误。如果您希望终端前景色(正常文本颜色)为绿色,只需在两台计算机上的终端模拟器设置中将其设置为绿色 - 在本例中为终端guake设置。这样,前景色保持绿色,并且具有彩色输出的命令将使用此颜色来显示普通文本。重置您的PS1提示,就像应该使用 完成的那样\[\e[0m\]

答案3

下面是我如何为不同的机器做不同颜色的提示。

case $HOSTNAME in
    host1*) PSC="\e[32m" ;;
    host2*) PSC="\e[33m" ;;
    host3*) PSC="\e[34m" ;;
    host4*) PSC="\e[35m" ;;
    *) PSC="\e[36m" ;;
esac

PS1="[\j]\[${PSC}\]\u@\h(\l) \[\e[37m\][ \w ]\[\e[00m\]\n\[\e[1m\]\#\[\e[0m\] \$ "

其余的大家可以自行品尝。将这个 ~/.bashrc 的副本放在您使用的每台计算机上。如果您使用安装了 NFS 的 home,它就会自动完成。

相关内容