Проблема настройки подсказки с предложением if

Проблема настройки подсказки с предложением if

Недавно я немного подправил свой PS1. Код выглядит следующим образом:

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

Отсутствующий символ изшрифты для ботаникови не имеет значения в моем вопросе (как и assemble_promptфункция).

Проблема, с которой я столкнулся, заключается в поломке PS1, когда я уменьшаю размер окна терминала до размера приглашения (приблизительно). Затем он, похоже, игнорирует настройку PS1 и устанавливает PS1 $только на символы (см. скриншот). Обратите внимание, что когда я начинаю печатать, он просто переопределяет мое пользовательское приглашение в этом случае.

PS1 сошла с ума

Я сузил проблему до предложения if, которое добавляет символ "fail", если предыдущая команда была неудачной. Если я уберу эту часть, все будет работать так, как и ожидалось.

Есть ли способ сохранить ifчасть предложения, но исправить проблему со сбросом PS1, когда размер окна слишком мал?

PS Я использую его rxvt-unicodeв качестве терминала, но проблема сохраняется и на всех других терминалах (проверено xterm, st).

решение1

Вероятно, вы захотите включить коды управления терминалом, \[...\]чтобы сообщить Bash, что они на самом деле не печатают символы. В противном случае они будут сбивать оболочку с толку при попытках подсчитать ширину приглашения.

Так что используйте "\[\e[91m\]xxx\[\e[0m\]".

Изруководство:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

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