weniger emulieren ein TTY, um die Pipe-Farbausgabe beizubehalten

weniger emulieren ein TTY, um die Pipe-Farbausgabe beizubehalten

Wenn Sie etwas durchleiten less, verwirft das Programm normalerweise Farbcodes, da es nicht an ein TTY ausgibt. Sie müssen also --color=alwaysdie Optionen ergänzen, damit es funktioniert.

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

Schlimmer noch ist, dass diese Option manchmal nicht einmal unterstützt wird und es daher eigentlich keine Möglichkeit gibt, die Farbausgabe an eine Pipe zu erzwingen.

Gibt es eine (relativ) einfache Möglichkeit, mit Less ein TTY zu emulieren, sodass ich nicht --color=alwaysjedem Programm mitteilen muss, wann Dinge dorthin weitergeleitet werden, und es nach Möglichkeit automatisch eine Farbausgabe anzeigt?

Antwort1

Das lessmuss sich nicht ändern. Die Ausgabe Ihrer anderen Programme wird an eine Pipe umgeleitet. Diese Programme erkennen, dass ihre Ausgabe nicht an ein TTY gesendet wird, und deaktivieren ihre Farbgebung. Sie müssen mit den Quellprogrammen etwas Besonderes tun, um ihre Ausgabe auch dann einzufärben, wenn sie an eine Pipe umgeleitet wird.

Ich glaube, ich habe eine Lösung für die Programme, die die Option --color=always nicht unterstützen. Der unbufferBefehl erstellt ein PTY und sendet die Ausgabe seines Argumentprogramms an dieses PTY, sodass das Argumentprogramm denkt, seine Ausgabe gehe an ein TTY und färbt sie ein.

Ich habe Folgendes als Experiment ausprobiert und es hat funktioniert. Mir fielen keine Programme ein, die ihre Ausgabe standardmäßig einfärben.

$ unbuffer ls --color=auto | cat

Muss man nicht auch die -rOption mit verwenden less, um Farbe anzuzeigen? Ich habe auch Folgendes versucht:

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

Antwort2

Unter FreeBSD können Sie:

env CLICOLOR_FORCE=yes ls -l | less -R

oder Sie können Optionen festlegen/überschreiben (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

in ~/.cshrc

Antwort3

Wenn das Programm isattyzur Bestimmung, ob Farbe verwendet werden soll oder nicht, verwendet,
besteht eine Möglichkeit darin, es zu überschreiben, indemLD_PRELOAD

Erstellen Sie eine Version von isatty, die immer „true“ zurückgibt.

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

Kompilieren Sie es und erstellen Sie eine gemeinsam genutzte Bibliothek.

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

Verwenden Sie die Umgebungsvariable LD_PRELOAD, um die gemeinsam genutzte Bibliothek zu laden.

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

Antwort4

Es gibt jedoch keine Möglichkeit, Less dazu zu bringen, ein PTY zuzuweisen, daher müssen Programme, die für die Entscheidung, ob sie Farbe ausgeben möchten oder nicht, von einem TTY abhängig sind, manuell informiert werden. Tut mir leid.

verwandte Informationen