grep 스위치 --color = auto의 기능은 무엇입니까?


8

스위치 auto옵션 --color이 grep에 어떤 영향 을 미칩니 까? grep은 언제 일치하는 문자열을 색칠하기로 결정합니까?

답변:


12

예상되는 행동

로 --color=autogrep은 출력이 터미널에 직접 기록되고 해당 터미널이 컬러 출력을 표시 할 수있는 경우 일치하는 문자열을 강조 표시합니다.

일반적으로 --color=auto원하는 것입니다. 예를 들어, grep을 사용하여 URL을 일치시키고 Wget으로 파이프하면 Wget은 \e[1;31mhttp://...실제 URL 대신 표시 됩니다 (그리고 질식).

다음 명령은 컬러 출력이됩니다.

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

그러나이 명령은 다음과 같아서는 안됩니다.

echo Super User | grep --color=auto Super | cat

이 동작이 일치하지 않으면 버그로 간주해야합니다.

소스 코드

을 사용 --color=auto하면 최신 Grep for Windows 버전 (2.5.4)과 원본 2.5.4를 기반으로하며 조건에 따라 출력 색상을 지정합니다.

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

즉, 출력이 터미널에 기록되는 경우에만 환경 변수TERM 가 정의되고 터미널은 dumb 이 아닙니다 .

TERM일반적으로 정의되어 있지 않기 때문에 Windows에서 원하는 동작을 생성 하지 않습니다. 이 문제에 대한 쉬운 해결책은 TERM=windows제어판에서 설정하는 것 입니다.

최신 버전의 grep (2.14)은 조건이있는 경우에만 출력을 색칠하여이 문제를 해결합니다.

isatty(STDOUT_FILENO) && should_colorize()

should_colorize()POSIX 및 Win32에 대해 다르게 정의 된 위치는 true입니다 .

전자의 경우 조건은 2.5.4 중 하나와 같습니다. 후자의 경우 환경 변수 TERM를 설정할 필요가 없습니다 (단지 할 수는 없습니다 dumb).


터미널에 쓰는지 아닌지 어떻게 알 수 있습니까?
— Trolzen

1
이를위한 C 함수가 있습니다. 당신이 헤더 파일을 포함하는 경우 sdgstd.h, istty(stdout)반환 0출력을 파일로 리디렉션합니다.
— 데니스

의 창 포트 I 실험 grep과 lessGnuWin 프로젝트에서 (gnuwin32.sourceforge.net). 유틸리티 cmd.exe로 개선되었습니다 ansicon. less --color=auto예상대로 작동 : 리디렉션이 적용되지 않은 경우 색상을 사용하고 출력이 리디렉션 될 때는 색상을 사용하지 않습니다. 그러나 grep --color=auto두 경우 모두 이스케이프 시퀀스를 인쇄하지 않습니다.
— Trolzen,

왜 이런 일이 발생하는지 이해할 수 없습니다. 나는이 유틸리티가 유닉스와 윈도우 버전에서 동일한 코드를 가지고 있으며 꽤 오래되었다고 생각했습니다. 따라서 동일하게 동작해야합니다.
— Trolzen

그것은 GnuWin32의 grep의 버그입니다. 우분투에서는 대답에 자세하게 설명되어 있습니다. 둘 다 동일한 소스 코드에서 파생되지만 다른 플랫폼에서 컴파일하려면 항상 약간의 조정이 필요합니다. 또한 GnuWin32의 현재 grep 버전은 2.5.4입니다. Ubuntu의 최신 버전은 2.12입니다.
— Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.