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 실험 greplessGnuWin 프로젝트에서 (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.