파이프 색상 출력을 보존하기 위해 TTY를 덜 에뮬레이션합니다.

파이프 색상 출력을 보존하기 위해 TTY를 덜 에뮬레이션합니다.

을 통해 무언가를 파이프할 때 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

그리고 색상을 표시하려면 -rwith 옵션을 사용해야 하지 않나요 ? 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에 의존하는 프로그램은 수동으로 지시할 필요가 없습니다. 죄송합니다.

관련 정보