을 통해 무언가를 파이프할 때 less
프로그램은 일반적으로 TTY로 출력하지 않기 때문에 색상 코드를 삭제합니다. 따라서 --color=always
작동하려면 옵션을 추가해야 합니다 .
ls -l --color=always | less
grep -R asdf --color=always | less
더 나쁜 것은 때로는 상황이 해당 옵션을 지원하지 않기 때문에 실제로 색상 출력을 파이프로 강제할 방법이 없다는 것입니다.
--color=always
파이프로 연결될 때 모든 프로그램에 지정할 필요가 없도록 TTY를 덜 에뮬레이트하고 가능하면 자동으로 컬러 출력을 표시하는 (상대적으로) 쉬운 방법이 있습니까 ?
답변1
less
변화가 필요한 것은 아닙니다 . 다른 프로그램의 출력이 파이프로 리디렉션됩니다. 해당 프로그램은 출력이 tty로 전송되지 않음을 감지하고 색상 지정을 비활성화합니다. 파이프로 리디렉션되는 경우에도 출력 색상을 지정하기 위해 소스 프로그램에 특별한 작업을 수행해야 하는 문제에 봉착했습니다.
--color=always 옵션을 지원하지 않는 프로그램에 대한 해결책이 있다고 생각합니다. 이 unbuffer
명령은 pty를 생성하고 인수 프로그램의 출력을 해당 pty로 보냅니다. 따라서 인수 프로그램은 출력이 tty로 갈 것이라고 생각하고 색상을 지정합니다.
나는 실험으로 다음을 시도했고 효과가있었습니다. 기본적으로 출력 색상을 지정하는 프로그램은 생각할 수 없었습니다.
$ unbuffer ls --color=auto | cat
그리고 색상을 표시하려면 -r
with 옵션을 사용해야 하지 않나요 ? 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
항상 true를 반환하는 isatty 버전을 만듭니다.
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
그러나 pty 할당을 줄이는 방법은 없으므로 출력 색상을 결정하기 위해 TTY에 의존하는 프로그램은 수동으로 지시할 필요가 없습니다. 죄송합니다.