
Когда я запускаю программу (например, grep
или ls
) без пейджера, ее вывод цветной. Однако, когда я запускаю ее, передавая ее вывод в less
, цвета не отображаются.
Например, эта команда выводит цветной вывод:
grep -r something
но это не так:
grep -r something | less
Почему? Как я могу видеть цвета через less
?
решение1
Здесь есть две проблемы:
- Такие команды, как
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 ();
решение2
Если вас интересуют цвета в less
более общем плане, вам, возможно, захочется взглянуть на lesspipe.sh
. См., например,https://github.com/wofr06/lesspipe.
lesspipe.sh — это входной фильтр для пейджера less, как описано на странице руководства less. Скрипт работает под управлением ksh-совместимой оболочки (например, bash, zsh) и позволяет использовать less для просмотра файлов с двоичным содержимым, сжатых файлов, архивов и файлов, содержащихся в архивах.
Он также раскрашивает скрипты оболочки, скрипты Perl и т. д. подобно текстовому редактору, но без использования какой-либо программы «предобработки» для раскрашивания.
решение3
Ответ @oli зависит от того, сможете ли вы предоставить соответствующие флаги команде, которая создает цвета. Это может быть сложно, если команды зарыты в скриптах и т. п., и это требует разработки того, как предоставить соответствующие флаги отдельно для различных команд, которые знают, как создавать экранированные символы ANSI, когда терминальная среда говорит, что они могут это сделать.
В ответе @DaveEmme говорится, что вы можете использовать lesspipe для раскрашивания вывода из любого источника, но, насколько мне известно, он не сохранит цвет из команд, которые уже его создают, когда вывод отправляется на терминал.
Если у вас уже есть команда, которая отлично работает в вашем терминале, то было бы неплохо иметь возможность запустить эту команду таким образом, чтобы цветовые экранирования сохранялись независимо от передаваемого вывода, чтобы вы могли передать его в less -R
.
unbuffer
делает это за вас. По крайней мере на Debian вы получаете это с помощью sudo apt install expect-dev
.
Затем вы можете сделать следующее:
unbuffer [command] |& less -R
Использование |&
вместо |
может быть излишней деталью, но это означает, что STDERR будет передан в less так же, как и STDOUT.
Благодаряhttps://superuser.com/a/1260695/229226для этого.