Меньше эмулировать TTY для сохранения цветного вывода
Когда ты что-то пропускаешь less
программа обычно отбрасывает цветовые коды, потому что она не выводится на TTY. Итак, вы должны добавить --color=always
к вариантам, чтобы он работал.
ls -l --color=always | less
grep -R asdf --color=always | less
Хуже всего то, что иногда вещи даже не поддерживают эту опцию, поэтому на самом деле нет способа принудительно выводить цвет в трубу.
Есть ли (относительно) простой способ сделать меньше эмулировать TTY, чтобы мне не пришлось указывать --color=always
к каждой программе, когда что-то передается по ней, и она автоматически отображает вывод цвета, когда это возможно?
5 ответов
Это не less
это должно измениться. Вывод других ваших программ перенаправляется на канал. Эти программы обнаруживают, что их выходные данные не отправляются в tty, и отключают их окраску. Вы застряли с необходимостью сделать что-то особенное с исходными программами, чтобы раскрасить вывод, даже если он перенаправлен на канал.
Я думаю, что у меня есть решение для программ, которые не поддерживают параметр --color=always. unbuffer
Команда создает pty и отправляет вывод своей программы-аргумента этому pty, поэтому программа-аргумент думает, что ее вывод идет в tty, и окрашивает его.
Я попробовал следующее в качестве эксперимента, и это сработало. Я не мог придумать ни одной программы, которая по умолчанию окрашивает их вывод.
$ unbuffer ls --color=auto | cat
Кроме того, вы не должны использовать -r
вариант с less
заставить его отображать цвет? Я также попробовал это:
$ unbuffer ls --color=auto | less -r
Если программа использует 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
На 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
В оболочке Bash FreeBSD, чтобы заставить цветной трубопровод работать с использованием less, сделайте следующее...
$ export CLICOLOR_FORCE=yes
$ ls -G | less -R
Вы можете добавить команду экспорта в свой .bashrc
или же .bash_profile
,
Тем не менее, нет никакого способа уменьшить выделение pty, поэтому программы, которые зависят от TTY для принятия решения о выводе цвета или не требуют ручного указания. Сожалею.