7

У меня есть скрипт bash, полученный из точечных файлов Гэри Бернхардта, который распечатывает красивый раскрашенный список последних коммитов git. Он использует команду column для выравнивания вывода в столбцы. На моем Mac это работает чудесно.

Как ни странно, когда я запускаю его на Cygwin или CentOS 6, бит столбца не работает. Все поля имеют три пробела между ними, независимо от их длины, образуя зубчатые желоба между "столбцами". Я сузил его до escape-кодов ANSI Color. Если я уберу их, столбцы получатся выстроенными.

Версия zsh одинакова на всех трех (и проблема выглядит точно так же в bash). Я не могу сказать, какая версия column , но они выглядят точно так же, и их справочные страницы одинаковы для чего бы то ни было.

Почему это работает на моем Mac, а не на других ОС?

2 ответа2

1

column работает на основе символов. Он подсчитывает печатаемые символы каждой ячейки, а затем прокладывает их для выравнивания (см. Источники кода для v2.29).

Проблема, с которой вы сталкиваетесь, заключается в том, что ваш поток содержит непечатную управляющую последовательность ANSI, в которую встроены печатные символы. Затем column не может вычислить минимальную ширину реальной ячейки этих ячеек и выровняет следующие ячейки той же строки.


Вот пример с синим цветным кодом <esc>[34m для ячейки A , использующий столбец v2.29:

$ echo '\033[34mA\033[0m B\nC D'|column -t
A  B
C         D

Клетка рассматриваются как высота печати-символ долго , так как только оба символа побега обнаруживается как не для печати. Следовательно, столбец C имеет семь нежелательных пробелов.


Обратите внимание, что это поведение не согласовано между выпусками столбца. Версия 2.26 использует wcswidth для вычисления видимой ширины ячеек и приводит к другому неправильному выравниванию.

0

Возможно, команда column просматривает $TERM и / или $LANG чтобы увидеть, что (если вообще что-то) составляет цветовой код.

Конечно, вы можете просто использовать git log --pretty=format:... для вывода выровненного по столбцам журнала с цветовой кодировкой для начала. Например, я использую git hist и имею это в моем ~/.git/config:

[alias]
   hist = log --pretty=format:\"           \t%C(yellow)%h %C(red)%ad %C(cyan)%aN%C(reset)   \t| %s%C(blue)%d%C(reset)\" --graph --date=short

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .