меньше эмулировать TTY для сохранения вывода цвета по каналу

меньше эмулировать TTY для сохранения вывода цвета по каналу

Когда вы что-то передаете через less, программа обычно отбрасывает цветовые коды, поскольку она не выводит на TTY. Поэтому вам нужно добавить --color=alwaysопции, чтобы это работало.

ls -l --color=always | less
grep -R asdf --color=always | less

Хуже того, иногда эта опция вообще не поддерживается, так что фактически нет возможности принудительно выводить цвет в конвейер.

Есть ли (относительно) простой способ заставить less эмулировать TTY, чтобы мне не приходилось указывать --color=alwaysкаждой программе, когда на нее что-то передается, и чтобы она автоматически отображала цветной вывод, когда это возможно?

решение1

Это не lessто, что нужно менять. Вывод других программ перенаправляется в канал. Эти программы обнаруживают, что их вывод не отправляется в tty, и отключают свою раскраску. Вам придется делать что-то особенное с исходными программами, чтобы раскрасить их вывод, даже если он перенаправлен в канал.

Я думаю, у меня есть решение для программ, которые не поддерживают опцию --color=always. unbufferКоманда создает pty и отправляет вывод своей аргументной программы в этот pty, поэтому аргументная программа думает, что ее вывод идет в tty, и раскрашивает его.

Я попробовал следующее в качестве эксперимента, и это сработало. Я не смог вспомнить ни одной программы, которая по умолчанию раскрашивает свой вывод.

$ unbuffer ls --color=auto | cat

Кроме того, разве вам не нужно использовать -rопцию с, lessчтобы заставить его отображать цвет? Я также попробовал это:

$ unbuffer ls --color=auto | less -r

решение2

на FreeBSD вы можете:

env CLICOLOR_FORCE=yes ls -l | less -R

или вы можете установить/переопределить параметры (csh/tcsh):

alias less less -R
setenv CLICOLOR_FORCE yes
setenv  LS_COLORS "no=00:fi=00:di=01;36:ln=01;37;44:pi=40;33:so=01;35"
setenv  LS_COLORS "$LS_COLORS":"bd=40;33;01:cd=40;33;01:or=40;31;01"
setenv  LS_COLORS "$LS_COLORS":"ex=01;32;40:*.tar=01;31:*.tgz=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.arj=01;31:*.taz=01;31:*.lzh=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.zip=01;31:*.z=01;31:*.Z=01;31"
setenv  LS_COLORS "$LS_COLORS":"*.gz=01;31:*.deb=01;31:*.jpg=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.gif=01;35:*.bmp=01;35:*.ppm=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.tga=01;35:*.xbm=01;35:*.xpm=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.tif=01;35:*.mpg=01;37:*.avi=01;37"
setenv  LS_COLORS "$LS_COLORS":"*.gl=01;37:*.dl=01;37:*.tex=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.ps=01;35"
setenv  LS_COLORS "$LS_COLORS":"*.php=01;33"
setenv  LS_COLORS "$LS_COLORS":"*.sh=00;31"
setenv  LS_COLORS "$LS_COLORS":"*.txt=01;37:*.conf=01;37:*.config=01;37"
setenv  LSCOLORS GxExcxdxCxegedabagacad

в ~/.cshrc

решение3

Если программа использует isattyдля определения, использовать цвет или нет,
один из способов сделать это — переопределить его с помощьюLD_PRELOAD

Создайте версию isatty, которая всегда возвращает true.

echo "int isatty(int x) { (void) x; return 1 ;}" > isatty_override.c

Скомпилируйте его и создайте общую библиотеку.

gcc -c -fPIC isatty_override.c -o isatty_override.o
gcc isatty_override.o -shared -o isatty_override.so

Используйте переменную среды LD_PRELOAD для загрузки общей библиотеки.

LD_PRELOAD=./isatty_override.so ls -l | less

решение4

Однако нет способа заставить less выделить pty, поэтому программы, которые зависят от TTY для принятия решения о выводе цвета или нет, должны быть проинформированы об этом вручную. Извините.

Связанный контент