group-telegram.com/misha_writes_code/217
Last Update:
📌 Рубрика "Надо было знать, но я не знал"
Всегда писал:grep ... | less
и грустил, потому что grep
выводит цветной текст, а в less
всё становится монохромным.
Думал, что это less
тупой. Оказалось, что не он, а я.
Но почему?grep
, как и многие другие Unix-утилиты (ls
, diff
, ripgrep
и т. д.), проверяет, является ли стандартный вывод (stdout) терминалом и в зависимости от этого включает или выключает цвета.
Это логично: чтобы выделить слово цветом, в терминале нужно добавить специальные управляющие последовательности в начало и в конец. Эти символы интерпретируются терминалом, но не нужны в файле или пайпе.
Такая проверка выполняется с помощью isatty(3):isatty(STDOUT_FILENO)
Этот функция возвращает 1
, если вывод идёт в терминал, и 0
, если в файл или пайп. Если isatty
возвращает 0
, утилита отключает цвет.
Нашёл даже коммит, в котором этот функционал добавили в grep
:
🔗 Коммит в grep
Как спастись?
Чтобы grep
, ripgrep
, ls
, diff
и другие челы не отключали цвета при передаче вывода в less
, нужно явно указать, что цвет всегда должен быть включен:grep --color=always ... | less
(Вроде как надо еще -R
добавлять к less
, но у меня и без этого работает 🤔)При этом опасно добавлять --color=always в алиасы, потому что это может поломать разные скрипты, которые используют grep.
(спасибо @asokol123, теперь я еще знаю, что алиасы не пролезают в скрипты)
Надеюсь, кому-то теперь тоже станет проще жить)
🔗 Обсуждение на SuperUser
BY Миша пишет код

Share with your friend now:
group-telegram.com/misha_writes_code/217