Ошмётки в консоли

Как известно, много лет назад «Эпл» перешла с процессоров «Интел» на собственные, основанные на архитектуре «АРМ». Процессоры несовместимы, однако бинарные программы, скомпилированные под «Интел», продолжают работать — в «МакОС» встроен специальный транслятор, который обеспечивает такую возможность.

Много лет я таскаю с собой различные утилиты, которые при переходе с одного «Макбука» на другой автоматически копируются при помощи встроенной в ОС процедуры миграции. Однако некоторое время назад я занялся тем, что с помощью brew перевёл всё это бинарное хозяйство на «АРМ».

По пути у меня что-то неприятно сломалось — иногда, при редактировании командной строки, всё странно съезжало, части текста наезжали друг на друга и невозможно было понять какая команда получится в итоге.

Я всю голову сломал, пытаясь понять что же произошло, даже переставил себе iTerm2, думал дело в нём, но не помогло. Подумал, что может у меня что-то такое погружается при старте терминала, что всё ломает. В итоге стал отключать команды по одной строке в .bash_profile, пока не отключил строку с переменной PS1, задающей вид приглашения перед вводом программы, и всё стало нормально работать.

Тут я каким-то образом догадался, что дело в кодах, задающих цвет приглашения. Спросил у ЧатаГПТ и тот подтвердил мою догадку.

Оказывается библиотека readline, отвечающая за редактирование текста в командной строке, неправильно считает длину строки, если в ней есть управляющие символы, — например, задающие цвет. Чтобы всё работало как надо, их надо обрамлять специальными последовательностями \[ и \]. Если я когда-то это и знал, то успел прочно забыть.

В общем, я заменил приглашение с

PS1='\e[33;1m\u: \e[31m\W$(__git_ps1)\e[0m \$ '

на

PS1='\[\e[33;1m\]\u:\[\e[0m\] \[\e[31m\]\W$(__git_ps1)\[\e[0m\] \$ '

и всё заработало как надо.

1

Читайте также

Bashnut Battery
Есть такая программа — coconutBattery, красиво показывает под MacOS X состояние батареи и некоторые другие характеристики. Поскольку я тут тренируюсь писать под Bash, решил сегодня повторить её функционал.
2011
Brew: x86 → ARM
На «Маке» есть такая штука как «брю» (brew), позволяющая без усилий ставить различные утилиты командной строки. Я ей давно и часто пользуюсь, потому что командная строка меня не пугает, а в некоторых сценариях это самый простой и быстрый способ что-либо сделать.
2025
Бинарные часы на bash
Раз пошла такая пьянка (в смысле, раз уж день программиста), я на радостях решил не останавливаться на достигнутом и написать что-нибудь ещё на Bash. Bash Binary Clock (9.50КиБ)
2011

Комментарии 3