Чому підказки bash іноді зберігають частину попередніх команд під час прокрутки історії?


29

Моє баш-підказка, яке я визнаю, що вкрало з кількох місць і зчепило разом, іноді додасть частину попередніх команд до його довжини, коли прокручує історію баш стрілками вгору / вниз.

Наприклад, якщо мої попередні команди були:

ls
cd /home/caleb
vim .bashrc

Коли я був за запитом і прокручувався двічі, це може виглядати так:

$ vim .bcd / home / caleb

Де перші п'ять символів залишилися від останньої команди.

Хтось має уявлення, чому це відбувається, і як це можна зупинити?

Мій підказки встановлено за допомогою цього коду (шлях до його включення): https://gist.github.com/1679352


1
Встановіть PS1 значення, не маючи всі vcs лайно і подивіться, що відбувається. Це моя здогадка.
Даніель Бек

Ви вже знайшли винуватця у своєму запиті? У мене те саме питання.
акме

Так, баш втрачає його на кольорах, і не в змозі відокремити довжину струн кольоровим кольором від довжини видимої струни. Це те, до чого ставився SiegeX. Я перейшов на ZSH і скористався іншим підказкою. ZSH не має тієї ж проблеми.
Калеб Томпсон

1
Обидві попередні відповіді не дозволили вирішити мою проблему і не дали пояснень, чому це сталося. Будь ласка, перевірте, що підказка користувача Bash сама перезаписується , якщо хтось має пошук до цього моменту.
D3Hunter

Пов'язаний випуск unix.stackexchange.com/questions/105958/…
matthiasbe

Відповіді:


6

Десь ваш підказки - фубар. Зазвичай відбувається те, що ваша оболонка думає, що виводить недрукувальні термінні коди, і очікує, що вона займе місце. Найкраща порада, яку я можу дати вам, - це систематично додавати у своє запит (або відбирати його) до тих пір, поки ця поведінка не зупиниться, щоб виділити код, що викликає цю проблему.


37

Коди кольорів потрібно загорнути у квадратні дужки. У дужках повідомляється, що доданий текст не повинен друкуватися

спираючись на приклад @ 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
Це має бути прийнятою відповіддю. Чи вирішили питання.
Atcold

1
Слід зазначити (тому що я не зазначив цього;)), що в тому безладі нахилів та квадратних дужок квадратні дужки, які дотримуються послідовності евакуації, \033НЕ повинні уникати . Уникати можуть лише квадратні дужки, що обгортають.
Бенджам

Спосіб збиття з пантелику для мене з усіма цими спеціальними символами, використання першого результату google допомогло створити робочу підказку саме так, як я цього хотів: ezprompt.net
Mallox

Я хотів налаштувати свої швидкі кольори для РОКІВ, але ніколи цього не мав, оскільки у мене завжди було це питання! Я ніколи не міг зрозуміти, чому я просто зупинився і тримав усе біле ... Я просто налаштовував новий комп’ютер, і він, нарешті, зійшов на мене, щоб насправді випустити проблему Google на раз ... Так що радий! Дякую за це чудове заняття.
TylerH4

8

У мене була така ж проблема, і вона була пов'язана з визначенням кольорів.

У моєму випадку у мене є рядковий рядок (дає більшу кількість місця для поточної команди незалежно від довжини шляху, відображеного підказкою).

Неправильна версія:

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)


Це визначило для мене питання, в той час як поточна прийнята відповідь була надто загальною.
Брайан

Це більш точна відповідь і має стати переможцем (і це було вирішенням і моєї проблеми).
Craveytrain

\nтеж був винуватцем для мене. Спасибі!
mhulse

3

Насправді я думаю, що це стосується відсутнього розмежувача "недрукарських символів". У мене була точно така ж проблема, але переміщення її до того, як новий рядок (\ n) не вирішив її. Натомість я правильно оточив усі символи, що не надруковуються (тут, команди для розфарбовування) символами '\ [' та '\]'.

Погано (працює, але проблема з розміщенням історії описана вище):

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

Добре (оточує всі кольорові команди символами '\ [' і '\]' - не відображається історія команд пюре):

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

І якщо ви вкладаєте це в щось на зразок SecureCRT для автоматичного надсилання після входу в систему, можливо, вам доведеться подвоїти все, що завгодно (ставити подвійні косої риски скрізь), якщо система автоматичного входу споживає першу звороту косу рису, щоб визначити, який символ повинен бути надісланий. :

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(Це, безумовно, стосується SecureCRT і може бути правдою для інших, наприклад, PuTTY або TeraTerm - необхідне тестування з вашого боку.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.