
호출기 없이 프로그램(예: grep
또는 )을 실행하면 해당 출력에 색상이 표시됩니다. ls
그러나 출력을 으로 파이프하면 less
색상이 표시되지 않습니다.
예를 들어, 이 명령은 컬러 출력을 출력합니다.
grep -r something
하지만 그렇지 않습니다:
grep -r something | less
왜? 어떻게 색상을 통해 볼 수 있나요 less
?
답변1
여기에는 두 가지 문제가 있습니다.
ls
색상 지원을 자동 감지하는 것과 같은 명령은 파이프에서 지원을 찾지 않습니다.less
기본적으로 색상 코드만 표시하도록 설정되어 있습니다.
둘 다 극복할 수 있지만 약간 투박합니다.
ls --color=always | less -R
이는 ls
구체적이지 않습니다. 색상을 지원하는 많은 명령에는 재정의 인수도 있습니다.
좀 더 심층적인 대답은 ls
STDOUT이 실제 터미널에 속하는지 여부를 확인하는 것입니다. 파이프를 연결하면 STDOUT이 다음 명령의 STDIN으로 설정됩니다.
이건 직장에서도 볼 수 있어요ls
소스 코드 에서. isatty
상황을 파악하기 위해 명령(핵심 POSIX 인터페이스)을 사용합니다 .
기본적으로 색상이 켜져 있습니까?
print_with_color = (i == color_always || (i == color_if_tty && isatty (STDOUT_FILENO)));
여러 열로 출력하려고 합니까?
if (format == long_format) format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line); //... if (isatty (STDOUT_FILENO)) { format = many_per_line; set_quoting_style (NULL, shell_escape_quoting_style); qmark_funny_chars = true; } else { format = one_per_line; qmark_funny_chars = false; }
grep
명시적으로 재정의하지 않는 한 매우 유사한 작업을 수행하며 다음을 사용하여 색상 지원을 감지합니다 isatty
.
color_option = isatty (STDOUT_FILENO) && should_colorize ();
답변2
보다 일반적 으로 색상에 관심이 있다면 less
를 살펴보는 것이 좋습니다 lesspipe.sh
. 예를 들어 다음을 참조하세요.https://github.com/wofr06/lesspipe.
lesspipe.sh는 less 매뉴얼 페이지에 설명된 대로 호출기 less에 대한 입력 필터입니다. 스크립트는 ksh 호환 셸(예: bash, zsh)에서 실행되며 바이너리 콘텐츠, 압축 파일, 아카이브 및 아카이브에 포함된 파일이 포함된 파일을 보는 데 더 적은 비용을 사용할 수 있습니다.
또한 텍스트 편집기와 유사하게 쉘 스크립트, Perl 스크립트 등을 색상화하지만 색상화를 수행하기 위한 "전처리" 프로그램을 사용하지 않습니다.
답변3
@oli의 대답은 색상을 생성하는 명령에 적절한 플래그를 제공할 수 있는지 여부에 달려 있습니다. 명령이 스크립트 등에 묻혀 있으면 어려울 수 있으며 터미널 환경에서 가능하다고 할 때 ANSI 이스케이프를 생성하는 방법을 알고 있는 다양한 명령에 대해 별도로 적절한 플래그를 제공하는 방법을 연구해야 합니다.
@DaveEmme의 답변에 따르면 lesspipe를 사용하여 모든 소스의 출력에 색상을 지정할 수 있지만 내가 아는 한 출력이 터미널로 이동할 때 이미 생성한 명령의 색상은 유지되지 않습니다.
터미널에 제대로 작동하는 명령이 이미 있는 경우 파이프되는 출력에 관계없이 색상 이스케이프가 유지되는 방식으로 해당 명령을 실행하여 less -R
.
unbuffer
당신을 위해 이 일을 합니다. 데비안에서는 적어도 sudo apt install expect-dev
.
그런 다음 다음을 수행할 수 있습니다.
unbuffer [command] |& less -R
|&
대신 을 사용하는 것은 |
불필요한 세부 사항일 수 있지만 이는 STDERR이 STDOUT뿐만 아니라 더 적은 것으로 파이프된다는 것을 의미합니다.