Моя командная строка bash, которую я, признаюсь, украл из нескольких источников и слепил на скорую руку, иногда добавляет часть предыдущих команд к своей длине при прокрутке истории bash с помощью стрелок вверх/вниз.
Например, если бы мои предыдущие команды были:
ls
cd /home/caleb
vim .bashrc
Когда я получил приглашение и прокрутил страницу вверх дважды, это могло выглядеть так:
$ vim .bcd /home/caleb
Где первые пять символов остались от последней команды.
Есть ли у кого-нибудь идеи, почему это происходит и как это можно остановить?
Моя подсказка настроена с помощью этого кода (слишком длинного, чтобы включать его здесь):https://gist.github.com/1679352
решение1
Где-то ваш запрос fubar. Обычно происходит так, что ваша оболочка думает, что выводит непечатаемые коды терминов и ожидает, что они займут место. Лучший совет, который я могу вам дать, — это систематически добавлять (или убирать) ваш запрос, пока это поведение не прекратится, чтобы изолировать код, вызывающий эту проблему.
решение2
Коды цветов должны быть заключены в квадратные скобки. Скобки сообщают bash, что заключенный в них текст не должен быть напечатан
Основываясь на примере @Phreditor, можно увидеть, что любое форматирование, выполненное после новой строки, приведет к исходной проблеме:
export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "
Оборачивание кода формата в [] гарантирует, что раздражающее поведение никогда не возникнет:
export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "
Документация:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html
Поскольку форматирование PS1 приводит к тому, что значение становится слишком длинным и его трудно читать, я помещаю коды форматирования в переменные:
BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "
решение3
У меня была та же проблема, и она была связана с определениями цветов.
В моем случае у меня многострочная подсказка (дает больше места для текущей команды, независимо от длины пути, отображаемой в подсказке).
Плохая версия:
export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "
Хорошая версия:
export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "
\033[00m
завершает цвет. Если он находится после новой строки ( \n
), он препятствует правильной перерисовке в терминале, чтобы перезаписать предыдущие команды фоновым цветом. Перемещение его за новую строку решило проблему.
(используя Терминал в Mac OS 10.8)
решение4
Я был с этой проблемой. Что я обнаружил?
Если внутри переменной PS1 есть цвета (например: "\e[35m"), они ВСЕГДА должны быть окружены "\[" и "\]" (например: "\[\e[35m\]").
Когда я обозначил все цвета в PS1 согласно этому правилу, это сработало!
Больше никаких проблем с прокруткой истории bash.
ПЛОХОЙ ПРИМЕР:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; экспорт PS1
ХОРОШИЙ ПРИМЕР:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e[0m\] "; экспорт PS1