Здесь есть две проблемы:
- Команды, такие как
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 ();
grep --color=always "search string" * | less -R
но я склонен использовать вmost
наше время вместоless
. ТАКЖЕ: gnu.org/software/src-highlite - подсветка цвета (работает меньше)