Почему эта командная строка bash иногда сохраняет часть предыдущих команд при прокрутке истории?

Почему эта командная строка bash иногда сохраняет часть предыдущих команд при прокрутке истории?

Моя командная строка 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

Связанный контент