$TERM은 어떻게, 어디서 해석되나요?

$TERM은 어떻게, 어디서 해석되나요?

좀 알고 싶어요터미널 매직내부 작업.

Docker 컨테이너를 사용하는 경우 $TERM환경 변수가 설정되지 않습니다. 이로 인해 vim 및 tmux와 같은 이상하게 보이는 콘솔 애플리케이션이 생성되었으며 CTRL+l(화면 지우기)도 무시되었습니다.

난 거의 다 확신해특징일부 화면 업데이트, 색상, 화면 재설정 등과 같은 명령은 모두 이스케이프 코드를 사용하여 구현됩니다.

그러면 이 변수는 어디에서 해석되며, 거기에 올바른 값을 설정하면 Ctrl+l을 사용하여 터미널 화면을 재설정할 수 있습니까? WHO조사하다예를 들어, 어떤 색상이 지원됩니까(xterm 대 xterm-256color)? 껍데기? ncurses와 같은 애플리케이션이나 라이브러리? 가능한 값/터미널 유형은 어디에 정의되어 있습니까?

답변1

$TERMterminfo 시스템에 의해 읽고 해석됩니다. terminfo는 또한 대부분의 시스템에서 찾을 수 있는 터미널 설명 데이터베이스를 참조합니다 /usr/share/terminfo. $TERM이 데이터베이스의 항목 중 하나와 일치해야 합니다. 기능이 더 적은 termcap이라는 오래된 라이브러리도 있지만 terminfo가 이를 대체했습니다. 최신 시스템에서 terminfo는 ncurses 라이브러리의 일부입니다.

애플리케이션은 일반적으로 라이브러리 기능을 직접 사용하여 터미널 기능을 얻습니다.tigetstr()또는 더 높은 수준의 Curses 인터페이스를 사용하여 화면 레이아웃을 관리합니다. 어느 쪽이든 $TERMterminfo 데이터베이스를 참조합니다.

답변2

TERM각 애플리케이션은 시스템 라이브러리를 통해 이 변수를 해석합니다. 해당 값은 데이터베이스에서 조회된 이름입니다. Unix 버전과 그 기간에 따라 데이터베이스는 다음과 같을 수 있습니다.용어 모자(전통적인 방식, 현재는 일반적으로 사용되지 않는 방식) 또는용어 정보(termcap이 개선되어 현재 대부분의 시스템에서 사용되기 때문에 최신입니다.)

termcap 및 terminfo 데이터베이스는 모두 함수 이름을 값과 연관시킵니다. 함수는 터미널이 수행할 수 있는 작업(줄 수, 밑줄 기능 등)에 대한 설명이거나 터미널과 교환할 수 있는 문자열(텍스트 형식 지정, 커서 이동 등을 위한 이스케이프 시퀀스)입니다. 다른 하나는 기능 키 방향 이스케이프 시퀀스로 표시됩니다). 당신은 볼 수 있습니다man 5 termcap그리고man 5 terminfo시스템에 어떤 기능이 알려져 있는지 확인하십시오.

예를 들어 Ctrl+를 L눌러 화면을 다시 그리면 터미널 데이터베이스의 기능을 읽어 커서를 이동하는 데 사용해야 하는 이스케이프 시퀀스를 알아냅니다. 설정되지 않았 거나 TERM잘못 설정되면 화면에서 커서를 이동하는 방법을 알 수 없습니다.

당신은 그것을 사용할 수 있습니다tput주문하다terminfo 데이터베이스에서 항목을 검색합니다. 예를 들어 tput lines터미널의 줄 수를 인쇄합니다. tput clear화면을 지웁니다(해당 출력이 터미널에 인쇄되기 때문에). 해당 이스케이프 시퀀스가 ​​무엇인지 확인하려면 읽을 수 있는 형식으로 인쇄하세요 tput clear | cat -v.

색상 수에는 역사가 꽤 있어서 제대로 작동하지 않습니다. 터미널 에뮬레이터는 일부 응용 프로그램이 중단되는 것을 방지하기 위해 색상 수를 적게 보고하는 경향이 있습니다. 바라보다tmux, TERM 및 256색 지원특히 tmux의 맥락에서 이에 대한 자세한 정보입니다. xterm-256colors와 의 차이점은 xterm전자는 terminfo에 256색을 보고하는 반면 후자는 전통적인 8색을 보고한다는 것입니다.

답변3

TERM, 통과관습터미널 설명을 참조합니다. 원래 이것은 a의 일부로 명명되었습니다.용어 모자텍스트 파일(1970년대 후반 이후). 1980년대 중반,용어 정보터미널 설명을 가져오는 시간을 절약하기 위해 컴파일된(바이너리) 파일로 도입되었습니다. 둘 다 모든 Unix 계열 플랫폼에서 사용할 수 있지만 termcap은 현재 terminfo를 사용한 에뮬레이션을 제외하고는 거의 사용되지 않습니다.

두 데이터 형식 모두 응용 프로그램은 일반적으로 재사용 가능한 프로그래밍 라이브러리를 사용하여 터미널 데이터베이스에서 데이터를 추출합니다. terminfo 프로그래밍 라이브러리는 별도의 라이브러리 파일로 제공될 수 있지만(예: 선택적으로 ncurses에서와 같이) 일반적으로 상위 수준의 Curs 라이브러리의 일부입니다. terminfo 라이브러리가 별도로 제공되는지 여부에 관계없이 이러한 경우에는curses 라이브러리의 일부로 간주됩니다. (속어와 같은 다른 고급 라이브러리도 있습니다).

각 터미널의 터미널 데이터베이스 항목에는능력. 이는 Curs 라이브러리(또는 termcap/terminfo를 직접 사용하는 애플리케이션)에 화면 지우기와 같은 유용한 작업을 수행하는 방법을 알려줍니다. 대부분의 터미널에서 이는 이스케이프 시퀀스입니다. 일부 터미널은 이 목적을 위해 이스케이프 시퀀스를 지원하지 않을 수 있습니다. Curses 라이브러리는 화면을 지우는(예: 각 줄 지우기) 기능과 결합될 수도 있습니다. 모든 함수가 이스케이프 시퀀스인 것은 아닙니다. 가지다부울 값그리고숫자예를 들어 다음과 같이 말할 수 있는 능력이 있습니다.~에 관계없이기능을 지원하며,몇 살뭔가(화면 크기 등).

termcap/terminfo를 사용하는 모든 애플리케이션은 해당 라이브러리를 사용하여 터미널 설명을 검색하고 인수를 특정 함수로 바꾸는 등의 작업을 수행합니다. 예를 들어, 대부분의 터미널은 현재 위치에서 주어진 수의 열이나 행만큼 커서를 이동하는 기능을 제공합니다. tparm(또는) tiparm숫자를 실제 이스케이프 시퀀스를 얻는 기능으로 바꾸는 함수입니다.

curses 라이브러리에는 터미널 데이터베이스를 유지 관리하는 명령줄 응용 프로그램이 있습니다(,정보 CMP) 및 터미널 데이터베이스를 쿼리하거나 터미널 기능을 사용하여 낮은 수준의 작업을 수행하기 위해 쉘 스크립트에 사용되는 일부 명령(산출,t세트/리셋).

가지다틀에 얽매이지 않는TERM터미널 데이터베이스를 사용하지 않고 사용되는 애플리케이션입니다. 대부분은 자신의 동작(예: GNU grep, groff 및 link/links2/elinks 텍스트 웹 브라우저)을 하드코딩합니다.희귀한자체 터미널 데이터베이스(예: GNU ls)와 동일하지만 다른 규칙과 동작을 사용합니다.

질문으로 돌아가서:

  • 그러면 이 변수는 어디에서 해석되며, 거기에 올바른 값을 설정하면 Ctrl+l을 사용하여 터미널 화면을 재설정할 수 있습니까?

    그리고기본 라이브러리는 이 값을 해석합니다. Bash 의 경우 controlLreadline 라이브러리에서 이 작업을 수행할 수 있습니다(termcap 프로그래밍 인터페이스 사용).

  • 예를 들어, 지원되는 색상(xterm 대 xterm-256color)은 누가 확인합니까?

    터미널 데이터베이스는 색상 수를 기능으로 저장하고 전경색과 배경색을 설정하고 색상을 재설정하는 기능도 저장합니다. 일부 애플리케이션은 이러한 기능을 개발자의 " xterm정말" 주장 과 같은 추가 정보와 결합합니다.xterm-256color

  • 껍데기?

    대부분의 쉘은 터미널 정보를 얻기 위해 termcap 프로그래밍 인터페이스를 사용합니다. 그러나 이는 고유한 동작을 갖는 애플리케이션입니다(반드시 저주와 동일할 필요는 없음).

  • ncurses와 같은 애플리케이션이나 라이브러리?

    (위 참조: 쉘은 특정 유형의 애플리케이션입니다)

  • 가능한 값/터미널 유형은 어디에 정의되어 있습니까?

    일반적으로 이는 저주 또는 속어 라이브러리를 사용하는 응용 프로그램이 공유하는 터미널 데이터베이스에 있습니다. 일부 애플리케이션은 하드코딩되어 있거나 개인 데이터베이스를 사용합니다.

추가 자료:

관련 정보