Назад | Перейти на главную страницу

Настраиваемая подсказка bash, нарушающая перенос длинных командных строк

У меня есть настраиваемая подсказка 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