Командная строка Bash с управляющими символами нулевой ширины

Командная строка Bash с управляющими символами нулевой ширины

Чтобы предотвратить искажение приглашения вокруг текста справа налево, я хочу вставить LRM нулевой ширины в приглашение bash (U200e). Поскольку это символ нулевой ширины, мой инстинкт подсказывал мне обернуть его в \[<200e>\]. Оказывается, это фактически заставляет bash переносить строки в неправильном месте. Когда я не обернул его ничем,затемКажется, все работает нормально.

Чего я не понимаю. Даже если bash автоматически определяет, что этот символ имеет нулевую ширину, обертывание его \[...\]a не должно было повредить чему-либо.

ОТРЕДАКТИРОВАНО: Итак, вопрос в следующем: когда \[...\]экранирование действительно необходимо и как оно может быть вредным, если экранируемые символы на самом деле имеют нулевую ширину.

решение1

Смотреть пост Экранирование символов нулевой длины в bash. и в частности ответ Майкла Аллена который я воспроизвожу ниже:

последовательности \[используются некоторыми утилитами, включая PS1, для представления \001и \002управляющих кодов:

\[=> \x01или\001

\]=> \x02или\002

printf и echo не выполняют преобразование из \[в \001.

Поэтому решением было сделать преобразование самому. Вместо того, чтобы оборачивать символы нулевой длины в \[:

echo "\[\033[1;30m\]foo\[\033[0m\]"

который выведет\[foo\]

Вместо этого я вывожу фактический код управления:

echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"

который выводит данные fooкак на PS1 printf, так и на echo.

Конкретный пример см.этот коммит на git-radar.

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