Пользовательская подсказка 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
1 ответ
Оберните каждую из ваших цветовых переменных в экранированные квадратные скобки:
\[${COL_USR}\]
или же
COL_USR="\[${COL_Y}${COL_BRIGHT}\]"
Это говорит Bash, что их следует считать нулевой шириной.
Это именно так, как описано в вопросе, с которым вы связаны. Если вы выполните следующую команду, вы увидите, что ваша переменная содержит последовательности символов, аналогичные "ручным". С помощью tput
только делает вещи переносимыми на несколько $TERM
типы, это не влияет на длину кодовых последовательностей. Это та длина, которая отбрасывает вещи.
echo ${COL_USR} | hexdump -c