При листании истории смещается позиция начала команды

Я меняю строку приветствия с помощью скрипта в /etc/profile.d/

if [ "$PS1" ]; then
PS1='\u\[\e[0m\]@\h\[[\e[1;31m\]PROD\[\e[0;37m\]]\W\\$ '
fi

Но есть одна проблема когда нажимаешь вверх что бы выполнить предыдущую команду пропадает пробел после $ Вроде мелочь, но глаз дергается, как победить?

ps

 OS: CentOS Linux release 8.2.2004 (Core)
 Kernel: 4.18.0-147.8.1.el8_1.x86_64
 Shell: GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)

введите сюда описание изображения


Ответы (1 шт):

Автор решения: aleksandr barakin

группируя некоторые последовательности символов (обычно это спец-коды для установки цвета) с помощью скобок \[ и \], вы подсказываете библиотеке gnu/readline, что данная последовательность символов при «отрисовке» не будет занимать ни одного знакоместа. это позволяет правильно рассчитывать длину приветствия и при «листании» истории выводить очередную команду в одной и той же позиции.

ошибка ваша находится здесь:

\[[\e[1;31m\]

внутрь группы у вас помещена не только (не занимающая ни одного знакоместа) последовательность \e[1;31m для установки красного цвета текста (31) и «жирного» написания (1), но и символ [, который должен выводиться «как есть», т.е., занимать знакоместо.

просто вынесите этот символ за пределы группы. судя по вашей задумке — перед ней:

[\[\e[1;31m\]
→ Ссылка