Странное поведение кода выхода ANSI в конце строки - PullRequest
0 голосов
/ 12 декабря 2018

Шаги для воспроизведения

Рассмотрим следующую команду оболочки:

echo -e "\e[41mTest\nTest2\e[0mTest3"

Она печатает Test и в следующей строке Test2 с красным фоном (с использованием escape-кода ANSI).За Test2 следует непосредственно Test3, который не окрашен.

Поведение

При первом выполнении этой команды все работает, как ожидалось.Однако вывод не соответствует.Приблизительно после 10-20 вызовов конец второй строки также становится красным.Я впервые наткнулся на это в моем приложении C ++.Так что я подумал, что это, вероятно, не связано с bash.

После открытия я подумал, что это может быть ошибка в gnome-terminal.Однако поведение точно такое же в xterm.

Edit

Благодаря комментарию Geno Chen я понял, что это происходит, когда в терминале заканчиваются линии и ему приходится прокручиваться.

Снимки экрана

Вот снимки экрана вышеупомянутой проблемы:

Терминал GNOME

GNOME Terminal

xterm

xterm

Вещи, о которых идет речь

Несмотря на то, что в моем приложении C ++ это немного неясно, это не нарушает условия сделки.Однако я хотел бы знать, если что-то не так с моими escape-последовательностями или это ошибка в какой-то части оболочки.И если есть что-то, что я могу сделать, чтобы это исправить или обойти это.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Это для всех, кто ищет быстрый ответ.Из ссылок ответа Томаса Дики я нашел следующий обходной путь:

echo -e "\e[41mTest\nTest2\e[0mTest3\e[K"

Часть \e[K закрашивает остальную часть строки текущим цветом фона.Поскольку его нужно отправлять перед каждым символом новой строки для каждой строки, использующей цвета, я должен немного переписать свой код ...

0 голосов
/ 12 декабря 2018

Заполнение строки выбранными в данный момент цветами - это деталь bce (стирание заднего цвета), которая может быть реализована по-разному в разных терминалах, но консоль Linux и xterm делают это таким образом.Это часто задаваемые вопросы:

...