콘솔 출력의 현재 색상을 결정하는 방법은 무엇입니까?


14

유색 터미널을 사용할 수 있으면 이스케이프 문자를 사용하여 출력의 색상을 지정할 수 있습니다 .

그러나 출력물이 현재 어떤 색으로 표시되는지 알아낼 가능성이 있습니까? 또는 지금 당장 출력하면 텍스트의 색상은 어떻습니까?

이 이스케이프 문자를 사용할 때 이전 색상 설정을 어 기지 말 것을 요청합니다. '기본 전경색'이스케이프 문자는 변경하기 전에 텍스트 색이 아닌 색 구성표에서 정보를 가져옵니다.


termcap 및 terminfo 변수를 보면 불가능한 것 같습니다. 예를 들어 터미널에서 echotc Co또는로 지원하는 색상 수를 얻을 수 echoti colors있지만 현재 색상 코드 정의를 저장하는 변수는 없습니다.
jimmij

@ jimmij 나는 그렇게 생각하고 뭔가를 그리워 바라고 있었다. 그것이 가능하지 않다는 것이 확실하다면, 답을 얻으십시오. 따라서 아무것도 따르지 않으면 나는 그것을 받아 들일 것입니다. 시간 내 줘서 고마워.
Minix

답변:


10

일반적으로 현재 색상을 얻는 것은 불가능합니다. 터미널의 제어 시퀀스 처리는 터미널의 "내부"에서 발생합니다. 커널 가상 터미널을 제공하는 운영 체제 커널에 내장 된 터미널 에뮬레이터 와 같은 터미널 에뮬레이터xterm 를 사용하면 현재 "그래픽 변환"개념 (예 : 색상 및 속성)을 포함한 에뮬레이터의 내부 상태가 시스템에 있습니다. 이론적으로 접근 가능합니다. 그러나 실제 터미널의 경우이 정보는 직렬 링크를 통해 연결된 물리적으로 분리 된 시스템의 일부 RAM 위치에 있습니다.

즉, 일부 터미널에는 해당 직렬 링크를 통해 전송되는 터미널 프로토콜의 일부로 이러한 정보를 읽는 메커니즘이 포함되어 있습니다. 이들은 프로그램이 터미널에 보낼 수있는 제어 순서를 제공 하여 터미널 입력으로 내부 상태에 대한 정보를 다시 보냅니다 . 터미널 에뮬레이터가 응답 mikeserv하는 제어 시퀀스를 보여줍니다 xterm. 그러나 이들은 특정합니다 xterm. 리눅스 커널에 내장 된 터미널 에뮬레이터와 다양한 BSD 커널은 예를 들어 터미널 유형이 다르며 이러한 제어 시퀀스를 전혀 구현하지 않습니다. 실제 터미널의 모든 제품군에 대해서도 마찬가지입니다.

DEC VT525 터미널은 판독 메커니즘을 구현하지만에 의해 사용되는 것과 관련이없는 일련의 제어 시퀀스를 갖습니다 xterm. 하나는 현재 그래픽 표현을 요청하기 위해 DECRQSS (요청 선택 또는 설정) 시퀀스를 전송하고, 단말기는 DECRPSS (보고서 선택 또는 설정)를 전송하여 응답합니다. 구체적으로 특별히:

  1. 호스트 전송 : DCS $ q mST (설정으로 SGR의 제어 기능 부분이있는 DECRQSS)
  2. 터미널 응답 : DCS 0 $ r 0 ; 3 3 ; 4 4 mST (현재 전경색 및 배경색을 설정하는 SGR 제어 시퀀스의 매개 변수 및 제어 기능 부분이있는 DECRPSS)

물론, 질문을주의 깊게 읽으면 유럽 통화 시스템에서 초콜릿으로 덮인 바나나를 다시 흔드는 것으로 나타납니다. 당신이있어 실제로 당신이 솔루션을 선택하고 해당 솔루션의 일부를 수행하는 방법을 요청했습니다하는, 일을하려고한다 이전의 상태를 유지 일부 colourized 출력을 쓰는 동안. 이를 수행하기위한 DEC VT 제어 시퀀스뿐만 아니라 xterm다양한 커널 내장 터미널 에뮬레이터에 의해 인식되는 SCO 콘솔 터미널 시퀀스 와 터미널에 대한 내용을 알려주는 termcap / terminfo 항목이 있습니다.

termcap 항목은 scrc입니다. terminfo 항목은 save_cursorrestore_cursor입니다. (당신이 무언가에 의존하고 있음을 그들이 경고 역할 않지만 이름은 다소 효과로 오해되어 사실상 보다는 합법적 ). 실제 DECSC, DECRC, SCOSC 및 SCORC 제어 시퀀스는 현재 그래픽 표현도 저장하고 복원합니다.

당신이 지적한 기사가 쉘 스크립트에서 제어 시퀀스를 생성하는 것에 관한 것이라면, 지금 찾고 있는 명령 은 tput입니다.

추가 자료


좋은 대답입니다. 다행 이네요. 고마워
Minix

@Minix- sc및 외에 rc터미널이 지원하는 경우 대체 버퍼를 살펴볼 수도 있습니다. 그렇습니다. 이것은 훌륭한 답변입니다. Minix, 아마도 이것을보십시오 : userspace의 콘솔로 / dev / fb0를 사용하는 방법 . nosh그가 추천 하는 스위트 룸에는 자신의 것이 있습니다.
mikeserv 2019

@ mikeserv 링크를 찾아 주셔서 감사합니다 :)
Minix

2
이것은 "xterm이 사용하는 것과는 아무런 관련이 없습니다"라는 것을 알았습니다. 그러나 xterm은 오랫동안 DECRQSS를 지원했습니다. 색상을 포함하여 SGR 응답이있는 부분은 1996 년으로 거슬러 올라갑니다.
Thomas Dickey

2
xterm에서 색상을 제공하기 시작했을 때 VT520 / etc 설명서를 사용할 수 없음을 나타내는 xterm의 제어 순서 설명서에서 추가 정보를 참조하십시오 DECRQSS(약 7 년 지연 ...).
토마스 디키 19

10

에서 xterm색상 변경 이스케이프를 쿼리로 변경하여보고 된 현재 색상 RGB 색상 코드를 얻을 수 있습니다. ESC ] Ps m-를 사용 하되 ?물음표를 추가 하십시오 . 로부터 문서 :

  • A는 경우 "?"오히려 이름 또는 RGB 사양보다 주어진다,xterm 해당 동적 색상을 설정하는 데 사용할 수있는 동일 형태의 제어 시퀀스와 응답한다. 하나의 제어 순서로 둘 이상의 색상 번호와 사양 쌍을 지정할 수 있으므로 xterm둘 이상의 응답을 할 수 있습니다.
    • PS = 100 → VT100 텍스트 전경색을 P t로 변경합니다.
    • PS = 1 1 → VT100 텍스트 배경색을 P t로 변경합니다.
    • Ps = 1 2 → 텍스트 커서 색상을 P t로 변경합니다.
    • P s = 1 3 → 마우스 전경색을 P t로 변경합니다.
    • Ps = 1 4 → 마우스 배경색을 P t로 변경합니다.
    • Ps = 1 5 → Tektronix 전경색을 P t로 변경합니다.
    • Ps = 1 6 → Tektronix 배경색을 P t로 변경합니다.
    • PS = 1 7 → 하이라이트 배경색을 P t로 변경합니다.
    • Ps = 1 8 → Tektronix 커서 색상을 P t로 변경하십시오.
    • PS = 1 9 → 하이라이트 전경색을 P t로 변경합니다.

이것이 다른 터미널 에뮬레이터에서 작동 할 가능성이 있는지 의심 스럽지만 xterm실행 중인 경우 에는 ...

printf '\033]11;?\007'

... xterm다음과 같은 순서로 터미널의 입력 버퍼로 되돌아갑니다.

11;rgb:ffff/ffff/ffff

... 배경 또는 전경 :

printf '\033]10;?\007'

10;rgb:0000/0000/0000

따라서을 실행 printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007하면 이전에 "정상"인 터미널의 모든 텍스트가 연한 파란색으로 바뀌 었습니다. 이후에 실행 printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'하면 연한 파란색 텍스트가 모두 "정상"으로 돌아갑니다. 이 값을 사용하여 앞으로 텍스트의 색상 만 변경하려면 어떻게합니까?
fourpastmidnight

@fourpastmidnight : 아마 clear처음?
mikeserv

문서를 이해하지 못한다고 생각합니다. "P s = 1 0-> VT100 전경색 변경"이라고 명확하게 말하고 있습니다. ;) 그러나 그것은 내가 기대 한 것이 아닙니다. "P s = 1 0; Pt =?"에서 검색 한 RGB 값을 사용해야 할 수도 있습니다. 내가 원하는 것을 달성하기 위해 또 다른 탈출 명령으로.
fourpastmidnight

따라서 printf '\033]10;?\007'터미널의 현재 전경색에 대해 xterm을 쿼리합니다. 터미널이 "정상"(예 : 전경색으로 7)으로 시작되었지만 명령 을 실행 tput setaf 3하기 전에 실행하는 경우 위 명령은 여전히 ​​"정상"을 반환합니다. 이것이 터미널의 현재 전경색이므로 맞습니다. 내가 원했던 것은 현재 커서 위치의 현재 색상을 검색하여 나중에 OP에 따라 "복원"하기 위해 저장할 수있는 방법이었습니다. printfprintf
fourpastmidnight

1
@ fourpastmidnight-여기 답변의 링크를 따라 갔습니까? 또한 Thomas Dickey- (이 질문에 대한 다른 답변에 댓글을 달았습니다)xterm관리자이며 여기에서 활발한 회원입니다. (링크는 그의 웹 사이트- xterm이스케이프 문서는 광범위하다-기본적으로 터미널을 작성하려는 다른 프로그래머를위한 표준 참조)
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.