Wenn Sie etwas durchleiten less
, verwirft das Programm normalerweise Farbcodes, da es nicht an ein TTY ausgibt. Sie müssen also --color=always
die 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=always
jedem Programm mitteilen muss, wann Dinge dorthin weitergeleitet werden, und es nach Möglichkeit automatisch eine Farbausgabe anzeigt?
Antwort1
Das less
muss 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 unbuffer
Befehl 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 -r
Option 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 isatty
zur 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.