파이프 색상 출력을 보존하기 위해 TTY 에뮬레이션을 줄입니다. asdf –color=always | less 더

무언가를 통해 파이프 less하면 프로그램은 일반적으로 TTY로 출력되지 않기 때문에 컬러 코드를 버립니다. 따라서 --color=always작동하려면 옵션에 추가 해야합니다.

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

더 나쁜 것은 때때로 상황이 해당 옵션을 지원하지 않기 때문에 실제로 색상 출력을 파이프에 강제로 적용 할 방법이 없다는 것입니다.

TTY를 에뮬레이션하는 데 상대적으로 쉬운 방법이 --color=always있습니까?



답변

less변경할 필요는 없습니다 . 다른 프로그램의 출력이 파이프로 리디렉션됩니다. 이러한 프로그램은 출력이 tty로 전송되지 않고 색상을 비활성화 함을 감지합니다. 파이프로 리디렉션 될 때도 출력을 색칠하기 위해 소스 프로그램에서 특별한 작업을 수행해야합니다.

–color = always 옵션을 지원하지 않는 프로그램에 대한 솔루션이 있다고 생각합니다. 이 unbuffer명령은 pty를 작성하고 인수 프로그램의 출력을 해당 pty로 전송하므로 인수 프로그램은 해당 출력이 tty로 가고 있다고 생각하여 색상을 지정합니다.

나는 실험으로 다음을 시도해 보았습니다. 기본적으로 출력을 색칠하는 프로그램을 생각할 수 없었습니다.

$ unbuffer ls --color=auto | cat

또한 -r옵션 을 사용하여 less색상을 표시 하지 않아도 됩니까? 나는 또한 이것을 시도했다 :

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


답변

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


답변

프로그램에서 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


답변

그러나 pty를 덜 할당 할 수있는 방법은 없으므로 색상을 출력하기 위해 TTY에 의존하거나 수동으로 말할 필요가없는 프로그램. 죄송합니다.


답변

FreeBSD의 Bash 쉘에서 컬러 파이프 작업을 덜 사용하려면 다음을 수행하십시오.

$ export CLICOLOR_FORCE=yes
$ ls -G | less -R

.bashrc또는에 내보내기 명령을 추가 할 수 있습니다 .bash_profile.


답변