У меня есть настраиваемая подсказка bash, которая окрашивает мое имя пользователя, имя хоста и текущий рабочий каталог. Цвета отображаются правильно, однако, когда я набираю командную строку, которую необходимо перенести, терминал не начинает новую строку и записывает начало моей команды. Это происходит в RHEL 4 и Debian.
Этот вопрос подробно описывает аналогичную проблему в OS X; Казалось бы, это проблема с неправильно завершенными управляющими последовательностями, однако я не вижу, что может быть причиной этого, поскольку я использую коды $ (tput) повсюду, вместо того, чтобы вручную создавать свои коды. Фрагмент ниже - может ли кто-нибудь посоветовать, что я делаю не так?
# Control codes
COL_RST=$(tput sgr0) # Remove all colour formatting
COL_BRIGHT=$(tput bold) # Emphasise
# Foreground
COL_G=$(tput setaf 2) # Green
COL_Y=$(tput setaf 3) # Yello
COL_B=$(tput setaf 4) # Blue
COL_USR=${COL_Y}${COL_BRIGHT}
COL_PWD=${COL_B}${COL_BRIGHT}
COL_HST=${COL_G}${COL_BRIGHT}
# Set prompt
PROMPT="${COL_USR}\u${COL_RST}@${COL_HST}\h${COL_RST}:${COL_PWD}\W${COL_RST}"
# Put it all together....
PS1="[$PROMPT]\$ "
export PS1
Заключите каждую цветовую переменную в экранированные квадратные скобки:
\[${COL_USR}\]
или
COL_USR="\[${COL_Y}${COL_BRIGHT}\]"
Это говорит Bash, что они должны считаться нулевой шириной.
Это в точности так, как описано в вопросе, на который вы указали. Если вы выполните следующую команду, вы увидите, что ваша переменная содержит последовательности символов, аналогичные «созданным вручную». С помощью tput
только делает вещи переносимыми на несколько $TERM
типов, это не влияет на длину кодовых последовательностей. Именно эта длина сбивает с толку.
echo ${COL_USR} | hexdump -c