Как сделать «меньшие» выходные цвета?

25

Когда я запускаю программу (например, grepили ls) без пейджера, ее вывод окрашен. Тем не менее, когда я запускаю его по конвейеру less, цвета не отображаются.

Например, эта команда выводит цветной вывод:

grep -r something

но это не так:

grep -r something | less

Зачем? Как я могу видеть цвета насквозь less?

Мохаммед Реза Резвани
источник
5
grep --color=always "search string" * | less -Rно я склонен использовать в mostнаше время вместо less. ТАКЖЕ: gnu.org/software/src-highlite - подсветка цвета (работает меньше)
Rinzwind
@alex ты установил python-pygments?
souravc
@souravc нет, я не установил это
Мохаммад Реза Резвани
@ales игнорируя меня, мы? >: - D
Rinzwind

Ответы:

36

Здесь есть две проблемы:

  • Команды, такие как lsавтоопределение поддержки цвета, не находят поддержку в каналах
  • less по умолчанию настроено отображение только цветовых кодов.

И то и другое можно преодолеть, но это немного неуклюже:

ls --color=always | less -R

Это не lsконкретное. Многие команды, которые поддерживают цвет, также имеют аргумент переопределения.


Несколько более глубокий ответ заключается lsв проверке того, принадлежит ли его STDOUT реальному терминалу или нет. Когда вы обмениваетесь данными, STDOUT устанавливается на STDIN следующей команды.

Вы можете увидеть это на работе в lsисходном коде . Он использует isattyкоманду (основной интерфейс POSIX), чтобы выяснить, какова ситуация:

  • Цвета включены по умолчанию:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Мы пытаемся вывести в несколько столбцов:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grepделает очень похожую вещь, если явно не переопределить, он обнаружит поддержку цвета, с isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();
Оли
источник
1
Мой последний upvote (достиг предела) на сегодня, чтобы поддержать вас за 100k. Но я и Ринзвинд хотим торт, когда это произойдет.
Hytromo
Я скачал программу с именем ack-grep. когда наберете ack-grep foo, он будет искать foo во всех подкаталогах. Так что я сделал ack-grep foo | меньше, и цвета ушли. Но, похоже, эта программа не поддерживает "--color = always", как бы то ни было, спасибо за помощь
Мохаммад Реза Резвани
1
У @alex ack есть --colorаргумент:ack-grep -i select --color | less -R
Оли
@ Оли ......... Боже мой ........ Единственное, что я могу сказать о твоих знаниях и помощи, а также о силе Linux
Мохаммад Реза Резвани
1
@ B1KMusic Я согласен. Я так согласен, что нашел как это работает и обновил ответ. Вы можете заставить столбцы с -Cаргументом.
Оли
2

Если вам интересны цвета в lessболее общем плане, вы можете посмотреть на них lesspipe.sh. Смотрите, например, http://freecode.com/projects/lesspipe .

lesspipe.sh является входным фильтром для пейджера less, как описано в справочной странице less. Сценарий запускается в ksh-совместимой оболочке (например, bash, zsh) и позволяет использовать меньше для просмотра файлов с двоичным содержимым, сжатых файлов, архивов и файлов, содержащихся в архивах.

Он также раскрасит сценарии оболочки, Perl-скрипты и т. Д. Аналогично текстовому редактору, но без использования какой-либо программы «предварительной обработки» для раскрашивания.

DaveEmme
источник