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

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

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

grep -r something

но это не так:

grep -r something | less

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

3 ответа

Решение

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

  • Команды как 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 ();

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

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

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

Ответ @oli зависит от того, сможете ли вы предоставить соответствующие флаги команде, которая создает цвета. Это может оказаться затруднительным, если команды скрыты в сценариях и т.п., и это требует разработки того, как предоставлять соответствующие флаги отдельно для различных команд, которые знают, как создавать escape-символы ANSI, когда среда терминала говорит, что это возможно.

Ответ @DaveEmme говорит вам, что вы можете использовать lesspipe для раскрашивания вывода из любого источника, но, насколько мне известно, он не сохранит цвет команд, которые уже создают его, когда вывод поступает на терминал.

Если у вас уже есть команда, которая отлично работает в вашем терминале, то было бы неплохо иметь возможность запускать эту команду таким образом, чтобы переходы цветов сохранялись независимо от передаваемого по конвейеру вывода, чтобы вы могли передать это вless -R.

unbufferделает это для тебя. По крайней мере, в Debian вы получаете это с помощьюsudo apt install expect-dev.

Затем вы можете сделать:

      unbuffer [command] |& less -R

С использованием|&вместо|может быть, это ненужная деталь, но это означает, что STDERR передается по конвейеру меньше, чем STDOUT.

За это спасибо /questions/760737/zapis-diska-fstab-nas/760748#760748 .

Другие вопросы по тегам