Здесь есть две проблемы:
- Команды, такие как
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 - подсветка цвета (работает меньше)