환경 변수가 있습니까?
예. 그것은이다 TERM
환경 변수. 의사 결정 프로세스의 일부로 사용되는 여러 가지가 있기 때문입니다.
모든 프로그램이 단일 결정 순서도에 동의하는 것은 아니기 때문에 여기서 일반화하기가 어렵습니다. 사실 grep
M. Kitt의 답변에서 언급 된 GNU 는 예상치 못한 결과와 함께 다소 특이한 결정 프로세스를 사용하는 특이 치의 좋은 예입니다. 따라서 매우 일반적인 용어는 다음과 같습니다.
- 에 의해 결정된 표준 출력은 터미널 장치 여야합니다
isatty()
.
- 프로그램은 termcap / terminfo 데이터베이스에서 터미널 유형에 대한 레코드를 찾을 수 있어야합니다.
- 그래서 그러므로이 있어야 할 찾아 볼 수있는 단말기 유형.
TERM
환경 변수가 존재해야하며 그 값은 데이터베이스 레코드와 일치해야합니다.
- 따라서 terminfo / termcap 데이터베이스가 있어야합니다. 서브 시스템의 일부 구현에서
TERMCAP
환경 변수를 사용하여 termcap 데이터베이스의 위치를 지정할 수 있습니다 . 따라서 일부 구현에는 두 번째 환경 변수가 있습니다.
- termcap / terminfo 레코드는 터미널 유형이 색상을 지원한다고 명시해야합니다. 있다
max_colors
필드의 terminfo에. 실제로 색상 기능이없는 터미널 유형에는 설정되어 있지 않습니다. 실제로 모든 채색 가능한 터미널 유형에 대해 색상 기능이 없음을 나타내는 이름에 추가 -m
되거나 -mono
추가 된 레코드가 있다는 용어 정보 규칙이 있습니다.
- termcap / terminfo 레코드는 프로그램이 색상을 변경하는 방법을 제공해야합니다. terminfo에
set_a_foreground
및 set_a_background
필드 가 있습니다 .
단순히 확인하는 것보다 조금 더 복잡 isatty()
합니다. 여러 가지 로 더 복잡해집니다.
- 일부 응용 프로그램은 우선 명령 줄 옵션 또는 구성 플래그 추가
isatty()
프로그램이 그래서, 검사를 항상 또는 결코 그것의 출력으로 (착색 할 수있는) 단자가 있다고 가정합니다. 예를 들어:
- GNU
ls
에는 --color
명령 행 옵션이 있습니다.
- BSD는
ls
상기 보이는 CLICOLOR
(의 부재 의미가없는 절대 )와 CLICOLOR_FORCE
(그것의 존재가 의미 항상 ) 환경 변수, 또한 스포츠 -G
명령 줄 옵션을 선택합니다.
- 일부 응용 프로그램은 termcap / terminfo를 사용하지 않으며의 값에 대한 고정 된 응답을 갖습니다
TERM
.
- 모든 단말기가 색상을 변경하기 위해 ECMA-48 또는 ISO 8613-6 SGR 시퀀스를 사용하는 것은 아니며 이름이 약간 "ANSI 이스케이프 시퀀스"인 경우도 있습니다. termcap / terminfo 메커니즘은 실제로 정확한 제어 시퀀스에 대한 직접적인 지식으로부터 응용 프로그램을 격리하도록 설계되었습니다. 또한 RGB 색상 SGR 시퀀스의 구분 기호로 세미콜론을 사용 하는 버그 에 동의 하기 때문에 아무도 ISO 8613-6 SGR 시퀀스를 사용 하지 않는다는 주장도 있습니다 . 표준은 실제로 콜론을 지정합니다.
언급했듯이 GNU는 grep
실제로 이러한 추가 복잡성 중 일부를 나타냅니다. termcap / terminfo를 참조하지 않고, 제어 할 수 있도록 제어 시퀀스를 배선하고, TERM
환경 변수에 대한 응답을 배선 합니다.
그것의 Linux / Unix 포트는이 코드 를 가지고 있는데, 이것은 TERM
환경 변수가 존재하고 그 값이 하드 와이어드 이름과 일치하지 않을 때만 채색을 가능하게 합니다 dumb
:
int
should_colorize (void)
{
char const * t = getenv ( "TERM");
리턴 t && strcmp (t, "dumb")! = 0;
}
그래서 심지어 경우 TERM
IS xterm-mono
, GNU는 grep
심지어 다른 프로그램하지만 같은 발광 색상을 결정합니다 vim
하지 않습니다.
그것 의 Win32 포트는이 코드 를 가지고 있는데, 이것은 TERM
환경 변수 가 존재 하지 않거나 존재하고 그 값이 하드 와이어드 이름과 일치하지 않을 때 채색을 가능하게 합니다 dumb
:
int
should_colorize (void)
{
char const * t = getenv ( "TERM");
돌아와! (t && strcmp (t, "dumb") == 0);
}
grep
색깔에 관한 GNU 의 문제
GNU grep
의 채색은 실제로 악명이 높습니다. 실제로 터미널 출력을 구성하는 적절한 작업을 수행하지는 않지만 헛된 출력의 여러 지점에서 몇 가지 고정 배선 제어 시퀀스를 비난하기 때문에 실제로는 특정 상황에서 잘못된 출력을 표시합니다.
이러한 상황은 터미널의 오른쪽 가장자리에있는 것을 채색해야합니다. 터미널 출력을 올바르게 수행하는 프로그램은 자동 오른쪽 여백을 고려해야합니다. 또한 터미널 힘이 그들을 가지고하지 않는 것이 약간의 가능성합니다 (즉 auto_right_margin
terminfo의 필드), 자동 오른쪽 여백이 있습니까 단말기의 동작은 종종 년 12 VT 전례 다음 자동 줄 바꿈을 보류중인 . GNU grep
는 이것을 즉시 설명하지는 않았지만 순식간에 줄 바꿈을 기대 하고 색상 출력이 잘못되었습니다.
컬러 출력은 단순한 것이 아닙니다.
추가 자료