Як зробити "менше" вихідних кольорів?


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
Моя остання пропозиція (досягла ліміту) на сьогодні, щоб підтримати вас на 100 к. Але я і Рінцвінд хочемо торт, коли це станеться.
hytromo

Я завантажив програму з ім'ям ack-grep. коли введіть ack-grep foo, він шукатиме foo у всіх підкаталогах. Отже, я зробив ack-grep foo | менше, а кольори пішли. Але, схоже, ця програма не підтримує "--color = завжди", як би то не було, дякую за допомогу
Mohammad Reza Rezwani

1
У @alex ack є --colorаргумент:ack-grep -i select --color | less -R
Oli

@ Олі ......... Боже мій ........ єдине, що я можу сказати про ваші знання та допомогу, а також владу linux
Мохаммед Реза Резвані

1
@ B1KMusic Я згоден. Я так погоджуюся, що дізнався, як це працює, і оновив відповідь. Ви можете примусити стовпці з -Cаргументом.
Олі

2

Якщо вас цікавлять кольори lessзагалом, ви можете поглянути lesspipe.sh. Дивіться, наприклад, http://freecode.com/projects/lesspipe .

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

Він також забарвлює сценарії оболонки, сценарії Perl тощо тощо, аналогічно текстовому редактору, але без використання жодної програми "попередньої обробки" для колоризації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.