'적은' 출력 색상을 만들려면 어떻게 해야 합니까?

'적은' 출력 색상을 만들려면 어떻게 해야 합니까?

호출기 없이 프로그램(예: grep또는 )을 실행하면 해당 출력에 색상이 표시됩니다. ls그러나 출력을 으로 파이프하면 less색상이 표시되지 않습니다.

예를 들어, 이 명령은 컬러 출력을 출력합니다.

grep -r something

하지만 그렇지 않습니다:

grep -r something | less

왜? 어떻게 색상을 통해 볼 수 있나요 less?

답변1

여기에는 두 가지 문제가 있습니다.

  • ls색상 지원을 자동 감지하는 것과 같은 명령은 파이프에서 지원을 찾지 않습니다.
  • less기본적으로 색상 코드만 표시하도록 설정되어 있습니다.

둘 다 극복할 수 있지만 약간 투박합니다.

ls --color=always | less -R

이는 ls구체적이지 않습니다. 색상을 지원하는 많은 명령에는 재정의 인수도 있습니다.


좀 더 심층적인 대답은 lsSTDOUT이 실제 터미널에 속하는지 여부를 확인하는 것입니다. 파이프를 연결하면 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뿐만 아니라 더 적은 것으로 파이프된다는 것을 의미합니다.

덕분에https://superuser.com/a/1260695/229226이를 위해.

관련 정보