bash - цвет избегает кодов - PullRequest
6 голосов
/ 22 ноября 2011

У меня есть скрипт, который использует escape-коды для выделения текстовых совпадений в своем выводе.Все хорошо, кроме случаев, когда вывод передается по каналу less, который печатает управляющие коды

например,

$ echo -e "\033[31m -- Hello World! -- \033[m"
 -- Hello World! --

Передается по less:

$ echo -e "\033[31m -- Hello World! -- \033[m" | less
ESC[31m -- Hello World! -- ESC[m

Мне было интересно, как другие инструменты, такие как ls, grep и т. Д., Могут выводить в цвете, но все же выглядит нормально, когда передано less?

Ответы [ 4 ]

9 голосов
/ 22 ноября 2011

Используйте less -R или добавьте LESS=-R в среду.Это требует, чтобы less передавал некоторые escape-последовательности (например, цвет) на терминал, а не печатал их как обычные символы.

7 голосов
/ 22 ноября 2011

grep и друзья определяют, есть ли вывод на терминал. Если их меньше, то они отключают окраску.

Посмотрите на isatty, чтобы проверить, является ли выход клеммой.

Обратите внимание, что иногда я нахожу это довольно раздражающим, потому что Я хочу меньше, чтобы отобразить цвета :

alias less='less -SR'
alias grep='grep --color=always'

Также обратите внимание на ANSIFilter для обратного: для фильтрации выходов ANSI из существующих потоков (вы также можете использовать его для создания из них HTML, RTF и, возможно, других форматов)

5 голосов
/ 22 ноября 2011

Большинство упомянутых вами инструментов вызывают функцию C isatty (), которая определяет, собирается ли соответствующий файловый дескриптор (в данном случае stdout) процесса на терминал.

Если выходные данные предназначены дляВ терминале они включают цвет, подсветку, издают звуковые сигналы или любые другие функции, которые, по их мнению, будут полезны для пользователя.Если терминала нет, они выводят необработанный текст для усвоения других инструментов.

Когда вы пишете

grep -v "Dogs" list-of-animals | less

Вызов isatty () из grep выполняется по дескриптору файла, ведущемук трубе, а не к вашему терминалу.Таким образом, он возвращает ноль, errno устанавливается в EINVAL или ENOTTY, а grep выводит необработанный текст, подходящий для меньшего.

2 голосов
/ 22 ноября 2011

Если вы хотите, чтобы меньше передавало последовательности выхода цвета на терминал:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -R

... или если вы хотите пропустить все escape-последовательности:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -r

...