`\e]11;?\a`에서 사람이 읽을 수 있는(예: RGB) 값을 얻으려면 어떻게 해야 합니까?

`\e]11;?\a`에서 사람이 읽을 수 있는(예: RGB) 값을 얻으려면 어떻게 해야 합니까?

이 문자열은 \e]11;?\a현재 터미널의 배경색을 생성할 수 있지만 이 정보를 사용하여 사람이 읽을 수 있는(예: RGB) 형식의 색상을 얻는 방법을 찾지 못했습니다.

나는 노력했다(아무것도 할 수 없었다)

print -P '\e]11;?\a'

그러나 그것은 아무것도 생산하지 않았거나 적어도 눈에 보이는 것은 전혀 없었습니다.

그런데, 나도 그걸 알고 있지만 xtermcontrol --get-bg, 내가 사용하고 있는 터미널에서 실행하면 다음과 같은 오류가 발생합니다.

xtermcontrol: --get-bg is unsupported or disallowed by this terminal. \
See also, TROUBLESHOOTING section of xtermcontrol(1) manpage.

( TROUBLESHOOTING section해결 방법은 제공되지 않습니다.)

그런데, 특정 터미널에서만 작동하는 솔루션이 아닌 일반적인 솔루션을 찾고 싶어서 사용 중인 터미널에 대한 세부 정보를 의도적으로 생략했습니다.

답변1

이 문제에는 몇 가지 기본적인 문제가 있습니다.

  1. 일반적인 솔루션을 생성하려면 명령이 지원되어야 합니다.ANSI X3.64, 기본 표준은모든 최신 터미널, 그러나 내가 아는 한 이것은 ANSI 명령이 아닙니다.

    표준 사본이 없고 온라인에서 찾을 수 없으며 ANSI도 없기 때문에 확실하지 않습니다.나한테 하나 팔아줘. 내가 온라인에서 찾을 수 있는 것은 멍청이들의 "참고 자료"뿐이었습니다. 내가 설명한 대로다른 곳에서, X3.64가 모든 일반적인 현대 터미널의 루트 표준이지만 이 관찰은 개가 늑대의 후손임을 지적하는 것과 약간 비슷합니다. 늑대를 연구하여 개에 대해 배우면 배울 수 있는 범위가 심각하게 제한됩니다.

    내가 찾은 최고의 리소스는 다음과 같습니다.XTerm 제어 순서xterm현재 관리자가 유지 관리하는 참조입니다 . 그러나 이는 표준 표준이 아니며 단순히 일반 프로그램의 기능을 설명합니다. 많은 프로그램이 xterm소스 코드에서 시작되지만 개와 늑대처럼 많은 프로그램이 크게 다릅니다.

    추적해 보면 이 명령이 다음에 의해 실행되었음을 알 수 있을 것 같습니다.xtermANSI X3.64의 확장이고 대상 터미널이 해당 특정 xterm확장을 지원하지 않기 때문에 xtermcontrol실패합니다.

  2. 특정 터미널 세트가 모두 이 명령에 응답하더라도 표시되지 않습니다.위에서 참고한 문서RGB 값을 얻게 됩니다. 아마도 색상 이름을 얻게 될 것입니다.

    (이것은 규범적인 표준이 결정할 것으로 기대하는 세부 사항이지만 기능 설명 문서에서는 종종 간과됩니다.)

    또한, R;G;B 답변을 받으시더라도 답변이 다를 수 있다는 점 참고 부탁드립니다. xterm이전 ANSI를 사용하여 색상을 설정하는 경우 코드의 RGB 색상입니다. 또한 일부 터미널 프로그램에서 이러한 값을 동적으로 변경할 수 있으므로 이제 색 구성표가 다르기 때문에 타사 프로그램에 의해 별도로 실행되는 두 프로그램이 서로 다른 답변을 제공할 수 있습니다.

가지다또 다른 대답SE 네트워크에서는 print귀하의 명령문과 거의 동일한 작업을 수행하지만 귀하의 명령과 마찬가지로 다른 답변의 echo명령은 OS X의 터미널에서 응답을 얻지 못합니다 xterm-256color. 이는 이 솔루션이 모든 xterm 시리즈 터미널에서 작동하지 않는다는 것을 의미합니다.

나는 오류가 발생하면 이를 진단하고 오류가 발생하지 않으면 인쇄 가능한 형식으로 반환 값을 표시하는 보다 강력한 C 프로그램을 작성했습니다. 셸 명령보다 확장에 더 적합할 수 있습니다.

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char reply[40];
size_t nr;

void timeout(int sn)
{
    if (nr > 0) {
        for (size_t i = 0; i < nr; ++i) {
            printf("Got char %d\n", reply[i]);
        }

        if (!sn) puts("WARNING: Buffer filled!");
    }
    else {
        puts("No reply from terminal.");
    }

    exit(0);
}

int main(void)
{
    signal(SIGALRM, timeout);
    alarm(1);
    printf("\e]11;?\a");

    for (nr = 0; nr < sizeof(reply); ++nr) {
        reply[nr] = getchar();
    }

    timeout(0);   /* buffer filled before alarm() timer went off! */
    return 0;
}

답변2

첫째, 제어 시퀀스에 대한 응답 이외의 일부 대체 접근 방식은 OP에서 요청한 "일반 솔루션"의 기초가 될 가능성이 없습니다. 예를 들어 추구하는 속성은 창 속성을 사용하는 메서드에 적용되지 않기 때문입니다.

다음은 xterm에서 구현되었지만 일반적으로 사용할 수 없는 제어 시퀀스의 예입니다. 개발자는xtermcontrol이것을 깨달으십시오. 그의 페이지에서는 다음과 같이 설명합니다.xterm제어 시퀀스, 의견에 따르면 그러한 시퀀스가 ​​많이 있다고 합니다(a과도한) 및 OSX 언급터미널 프로그램지원하다일부안에.

OP가 보고한 오류 메시지는 확실히 명확합니다. OP가 실행하려고 하는 이름 없는 프로그램은 xtermcontrol이 기능을 지원하지 않습니다. 아마도 대신 사용할 수 있는 유사한 기능을 지원하지 않을 것입니다.

사실, 대부분의 xterm 제어 시퀀스는 개발자가 터미널 설명으로 "xterm"을 사용하는 방식에 관계없이 다른 터미널에서 구현되지 않습니다. 예를 들어 xterm FAQ를 참조하세요.개수 제어를 사용하여 버전 비교, 그리고 ncurses FAQ왜 "xterm"으로 설정된 TERM을 사용하지 않습니까?(" xterm소스에서 파생됨"은 여러 가지 방식으로 해석될 수 있습니다.)

OP는 (아마도) 자신이 구현하는 제어 시퀀스에 대한 유용한 문서가 없는 터미널에 더 관심이 있을 것입니다. 따라서 현재 가지고 있는 솔루션이 얼마나 "일반적인"지 알 수 있는 유일한 방법은 철저하게 테스트하는 것입니다. 이런 일은 별로 흔하지 않은 것 같습니다.

이것최고 투표를 받은 슈퍼유저 답변사용되는 방법입니다 xtermcontrol. (이것반대표를 받은 xrdb답변현재 색상 설정은 제공되지 않고 xterm초기 값만 제공됩니다. 어쩌면 그 값도 아닐 수도 있습니다. )

관련 정보