如何正确定制PS1?

如何正确定制PS1?

我在 bashrc 中用它自定义了 bash

export PS1="\e[0;36m\h\e[m \e[0;33m\w/\e[m \e[0;31m\n\$ →\e[m  "

所以我得到这样的东西(带颜色):

Ahuri ~/Public/ 
$ →  

但我在使用长命令时遇到问题。当我编写一个比一行长的非常长的命令时,它开始覆盖我的第一行

例子 :

Ahuri ~/Public/ 
$ → ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

如果我继续添加“^”我得到:

Ahuri ~/Public/ 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我的“$→”被覆盖,然后整行被覆盖。

答案1

没有问题\n。这又是旧的转义序列长度问题:\e[0m和类似的不计入提示符的实际长度,因此您必须将它们括在\[..中\]以向解释器指出这一点:

PS1="\[\e[0;36m\]\h\[\e[m\] \[\e[0;33m\]\w/\[\e[m\]\n \[\e[0;31m\]\$ →\[\e[m\]  "

答案2

一个更简单的选择是使用tput序列:

export PS1='\[$(tput setaf 4)\]\h\[$(tput sgr0)\] \[$(tput setaf 3)\]\w/\[$(tput sgr0)\]\n\[$(tput setaf 1)\]\$ →\[$(tput sgr0)\] '

\[\]住由命令替换 ( $(tput … )) 插入的终端控制序列,以便 shell 不会将它们计为可打印输出。使用命令替换而不是硬连线的东西进一步确保您获得正确的无论您的终端类型是什么,控制序列。

答案3

用于$PROMPT_COMMAND显示附加行,这样您就无需\n输入$PS1

相关内容