터미널 에뮬레이터와 그 안에서 실행되는 셸이 다른 용어 유형을 사용하는 경우 어떤 "나쁜" 일이 발생할 수 있습니까(그리고 왜)?

터미널 에뮬레이터와 그 안에서 실행되는 셸이 다른 용어 유형을 사용하는 경우 어떤 "나쁜" 일이 발생할 수 있습니까(그리고 왜)?

예를 들어 PuTTY 구성에서는 터미널 유형을 로 설정했지만 SSH 로그인 후 xterm-256color셸에서 변경했습니다.export TERM=linux

나는 그것이 대부분의 경우에 잘 작동한다는 것을 알고 있습니다. PuTTY와 원격 셸 간의 불일치가 실제로 기술적인 관점에서 무엇을 의미하는지 이해하려고 노력 중입니다.

답변1

TERM변수는 터미널/에뮬레이터의 기능과 색상 변경, 커서 이동 또는 화면 지우기와 같은 터미널 제어 기능을 위해 보낼 올바른 코드를 찾는 데 사용됩니다.

이론적으로 TERM이 변수로 식별되는 터미널 유형은 /usr/share/terminfo/디렉토리 트리에 있는 터미널 유형 설명에 의해 정확하게 설명됩니다. 실제로 터미널 에뮬레이터에는 해당 동작이 유형 사양에서 벗어나도록 하는 버그가 있을 수 있습니다.

(단말기 종류 사양 자체에도 버그가 있을 수 있으나 이는 매우 오래된 기술이며 대부분의 버그는 오래 전에 해결되었습니다.)

예를 들어, 터미널은 모국어로 통신합니다. 애플리케이션은 일반적으로 이를 직접 말하지 않고 사용합니다.용어 정보데이터베이스는 사전/문구집 세트로 터미널과 통신합니다. TERM 환경 변수는 사용할 사전/문구집을 결정합니다.

TERM 값이 약간 잘못된 경우(예: 터미널 유형이 정확하지는 않지만 충분히 유사함을 나타내는 경우) berndbausch가 질문 의견에서 말했듯이 기능이 감소된 경우(예: 256색 대신 16색만 사용)는 대부분 정상일 수 있습니다. .

프로그램이 실제 터미널 유형에 존재하지 않는 기능을 사용하려고 하면 화면에 일부 정크 문자가 나타날 수 있습니다. 오류가 반대인 경우(즉, 터미널 유형 설명에 터미널에 실제로 있는 기능이 포함되어 있지 않은 경우) 프로그램은 터미널에 해당 기능을 사용할 수 없는 것처럼 작동합니다.

그러나 TERM 값이 완전히 잘못된 경우(완전히 관련되지 않은 터미널 유형을 나타냄) 화면 지우기 및 기타 기본 기능을 사용할 수 없으며 이를 사용하려고 하면 화면에 가비지 문자가 생성될 가능성이 높습니다. 프로그램 터미널 에뮬레이터가 실제로 인식하지 못하는 형식으로 터미널 제어 코드를 보내는 것입니다. 이 상태에서는 TERM 값이 수정될 때까지 일반 텍스트 편집기(Classic ex또는 Error 와 같은 기존의 줄 중심 편집기가 아닌)를 사용하는 것이 매우 어렵거나 불가능합니다 .ed

TERM 값이 완전히 누락된 경우 이를 필요로 하는 대부분의 프로그램은 기본값을 가정합니다 dumb. 즉, 기능이 극도로 제한된 매우 오래된 터미널이며 화면 대신 프린터가 있을 수도 있습니다. 이 경우 쓰레기 문자가 표시되지 않지만 일반 텍스트 편집기나 위의 기존 보기 내에서 텍스트 기반 전체 화면 표시(드롭다운 또는 팝업 메뉴)를 생성하는 모든 항목을 사용하여 완전히 잘못된 용어 설정과 같습니다. 터미널 창에서는 불가능합니다.

아주 오래된 터미널을 사용하는 예를 보려면 YouTube에서 CuriousMarc의 동영상을 참조하세요. https://youtu.be/2XLZ4Z8LpEE?t=501

CuriousMarc가 변수를 직접 할당하는 대신 이를 설정 tty33했지만 Linux에서 실제로 사용할 수 있는 특정 TERM 값이 있다는 점을 비디오에서 참고하세요. 그 가치는 그보다 더 간단할 수도 있습니다!agettyTERMdumb

이 TERM 유형의 내용은 유형 감지 메커니즘으로 사용할 수 있는 것이 반드시 없는 많은 이전 기술을 포괄하기 위한 것이므로 처음에는 자동 터미널 유형 감지에 대한 규정이 전혀 없었습니다.

getty유선 직렬 터미널의 경우 시스템 관리자는 새 터미널에 연결된 각 직렬 포트에 대한 프로세스를 추가할 때 올바른 터미널 유형을 구성해야 합니다. 모뎀 회선의 경우 시스템은 다음과 같이 구성될 수 있습니다.사용자에게 물어보세요올바른 터미널 유형을 찾으려면 /etc/profile감지된 세션이 비대화형 세션이 아닌 한 in 또는 이와 유사한 것을 입력하십시오.

터미널 유형 자동 감지에 몇 가지 발전이 있었지만 이러한 발전은 모든 경우에 적용되지는 않습니다(레거시 터미널 유형이 너무 많기 때문). 따라서 자동 감지는 관리자가 간주하는 경우 활성화할 수 있는 선택 기능으로 남아 있습니다. 필요한. 그들에게는 그만한 가치가 있습니다.

나중에 네트워크 프로토콜 기반 원격 액세스 방법이 개발되었을 때 추가된 기능 중 하나는 연결할 때 클라이언트에서 원격 호스트로 일부 추가 정보를 자동으로 전달하는 기능이었습니다. 이 중 TERM 값이 첫 번째일 수 있습니다. "모든 사람이 행복하다."

답변2

PuTTY는 "터미널 유형" 구성 옵션만 기본 TERM환경 변수 로 사용합니다.PuTTY SSH 클라이언트언제원격 서버에서 의사 터미널 요청.

이 설정을 사용하여 터미널 순서를 결정합니다.PuTTY 터미널 에뮬레이터이를 식별하고 해석하는 방법은 다소 어리석습니다. 실제로 PuTTY는그런 짓은 하지 마.

답변3

실제로 PuTTY의 동작은비슷한이 설명이 작성된 터미널에 대한 두 가지의 상위 집합도 아니고 정확히 일치하는 것도 아닙니다.

터미널 설명이 터미널과 일치하지 않으면 몇 가지 문제가 발생합니다.

  • 터미널이 다르게 구현하는 기능을 나열하면 애플리케이션이 잘못 작동합니다.
  • 터미널에서 구현한 기능을 생략하면 애플리케이션은 해당 기능을 무시합니다.
  • 터미널에서 구현되지 않은 기능이 나열되면 응용 프로그램이 다시 잘못 작동합니다.

PuTTY에 권장되는 터미널 설명은 다음과 같습니다."퍼티"그리고"퍼티-256색". infocmp를 사용하여 차이점을 보여주면 다음과 같습니다.

  • 일반적으로 256색을 지원하는 단말기는 8색도 지원합니다. 각 그룹 내에는 차이가 있습니다. PuTTY에는 색상 팔레트를 사용자 정의하는 기능이 부족하여(따라서 256색 지원이 불완전함) 이 기능을 부분적으로 지원합니다.
    퍼티와 퍼티-256color를 비교해 보세요.
        부울 값을 비교합니다.
        CC: 티: 에프.
        숫자를 비교하세요.
        색상: 8, 256.
        오른쪽: 64, 65536.
        문자열을 비교합니다.
        initc: '\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}% *%{1000}%/%02x', NULL.
        설정: '\E[4%p1%dm', '\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8 }%-%d%e48;5;%p1%d%;m'.
        setaf: '\E[3%p1%dm', '\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8 }%-%d%e38;5;%p1%d%;m'.

더 많은 "퍼티"운영 체제각각에는 다른 기능에는 없는 기능이 있고 일부는 공통 기능에 대해 서로 다르다는 것을 보여줍니다.

퍼티와 리눅스를 비교해 보세요.
    부울 값을 비교합니다.
    흑백: T: F.
    자주.
    시간: 시간: F.
    도끼:F:T.
    XT:T:F.
    숫자를 비교하세요.
    NCV: 22, 18.
    문자열을 비교합니다.
    acsc: '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~', '++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~'.
    cbt: '\E[Z', NULL.
    시민권: '\E[?25l', '\E[?25l\E[?1c'.
    cnorm: '\E[?25h', '\E[?25h\E[?0c'.
    cud1: '\ED', '\n'.
    cuu1: '\EM', '\E[A'.
    cvvis: NULL, '\E[?25h\E[?8c'.
    희미함: NULL, '\E[2m'.
    표시: '%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342 \227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\ E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15 }%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@% e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;', NULL.
    dsl: '\E]0;\007', NULL.
    enacs: '\E(B\E)0', '\E)0'.
    깜박임: '\E[?5h$<100/>\E[?5l', '\E[?5h$\E[?5l'.
    fsl: '^G', NULL.
    ich: NULL, '\E[%p1%d@'.
    ich1: NULL, '\E[@'.
    indn: '\E[%p1%dS', NULL.
    is2: '\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R', NULL.
    ka1: '\EOq', NULL.
    ka3: '\EOs', NULL.
    kb2: '\EOr', '\E[G'.
    kc1: '\EOp', NULL.
    kc3: '\EOn', NULL.
    kcub1: '\EOD', '\E[D'.
    kcud1: '\EOB', '\E[B'.
    kcuf1: '\EOC', '\E[C'.
    kcuu1: '\EOA', '\E[A'.
    켄트: '\EOM', NULL.
    kf0: '\EOy', NULL.
    kf1: '\E[11~', '\E[[A'.
    kf2: '\E[12~', '\E[[B'.
    kf3: '\E[13~', '\E[[C'.
    kf4: '\E[14~', '\E[[D'.
    kf5: '\E[15~', '\E[[E'.
    유형: '\E[B', NULL.
    kmous: '\E[', NULL.
    rs1: NULL, '\Ec\E]R'.
    rs2: '\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l', NULL.
    s0ds: '\E[10m', NULL.
    s1ds: '\E[11m', NULL.
    s2ds: '\E[12m', NULL.
    sgr: '\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4% t;5%;m%?%p9%t\016%e\017%;', '\E[0;10%?%p1%t;7%;%?%p2%t;4%;% ?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t\016%e \017%;'.
    smcup: '\E[?47h', NULL.
    smkx: '\E[?1h\E=', NULL.
    tsl: '\E]0;', NULL.
    TS: '\E]0;', NULL.
    XM: '\E[?1006;1000%?%p1%{1}%=%th%el%;', NULL.
    kp1: '\EOq', NULL.
    kp2: '\EOr', NULL.
    kp3: '\EOs', NULL.
    kp4: '\EOt', NULL.
    kp5: '\EOu', NULL.
    kp6: '\EOv', NULL.
    kp7: '\EOw', NULL.
    kp8: '\EOx', NULL.
    kp9: '\EOy', NULL.
    kpADD: '\EOl', NULL.
    kpDIV: '\EOQ', NULL.
    kpDOT: '\EOn', NULL.
    kpMUL: '\EOR', NULL.
    kpNUM: '\EOP', NULL.
    kpSUB: '\EOS', NULL.
    kpZRO: '\EOp', NULL.
    xm: '\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;', NULL.

"putty-256color"를 다음과 비교하세요.xterm-256colorPuTTY는 (예를 들어) xterm에서 제공하는 대부분의 기능 키 조합을 구현하지 않음을 보여줍니다.

putty-256color와 xterm-256color를 비교하세요.
    부울 값을 비교합니다.
    OTbs:F:T.
    흑백: T: F.
    ccc:F:T.
    시간: 시간: F.
    킬로미터: F:T.
    mc5i:F:T.
    NPC: F:T.
    케슨: T: F.
    도끼:F:T.
    숫자를 비교하세요.
    열 수: NULL, 80.
    행: NULL, 24.
    NCV: 22, 비어 있음.
    U8: 1, 비어 있습니다.
    문자열을 비교합니다.
    acsc: "aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", "aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~".
    지우기: '\E[H\E[J', '\E[H\E[2J''.
    cnorm: '\E[?25h', '\E[?12l\E[?25h''.
    cud1: '\ED', '\n'.
    cuu1: '\EM', '\E[A'.
    cvvis: NULL, '\E[?12;25h'.
    희미함: NULL, '\E[2m'.
    표시: '%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342 \227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\ E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15 }%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@% e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;', NULL.
    dsl: '\E]0;\007', NULL.
    enacs: '\E(B\E)0', NULL.
    fsl: '^G', NULL.
    ich: NULL, '\E[%p1%d@'.
    initc: NULL, '\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/ %2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\'.
    invis: NULL, '\E[8m'.
    is2: '\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R', '\E[!p\E [?3;4l\E[4l\E>'.
    kDC: NULL, '\E[3;2~'.
    kEND: NULL, '\E[1;2F'.
    kHOM: NULL, '\E[1;2H'.
    kIC: NULL, '\E[2;2~'.
    kLFT: NULL, '\E[1;2D'.
    kNXT: NULL, '\E[6;2~'.
    kPRV: NULL, '\E[5;2~'.
    kRIT: NULL, '\E[1;2C'.
    ka1: '\EOq', '\EOw'.
    ka3: '\EOs', '\EOy'.
    kb2: '\EOr', '\EOu'.
    kc1: '\EOp', '\EOq'.
    kc3: '\EOn', '\EOs'.
    켄데: '\E[4~', '\EOF'.
    kf0: '\EOy', NULL.
    kf1: '\E[11~', '\EOP'.
    kf13: '\E[25~', '\E[1;2P'.
    kf14: '\E[26~', '\E[1;2Q'.
    kf15: '\E[28~', '\E[1;2R'.
    kf16: '\E[29~', '\E[1;2S'.
    kf17: '\E[31~', '\E[15;2~'.
    kf18: '\E[32~', '\E[17;2~'.
    kf19: '\E[33~', '\E[18;2~'.
    kf2: '\E[12~', '\EOQ'.
    kf20: '\E[34~', '\E[19;2~'.
    kf21: NULL, '\E[20;2~'.
    kf22: NULL, '\E[21;2~'.
    kf23: NULL, '\E[23;2~'.
    kf24: NULL, '\E[24;2~'.
    kf25: NULL, '\E[1;5P'.
    kf26: NULL, '\E[1;5Q'.
    kf27: NULL, '\E[1;5R'.
    kf28: NULL, '\E[1;5S'.
    kf29: NULL, '\E[15;5~'.
    kf3: '\E[13~', '\EOR'.
    kf30: NULL, '\E[17;5~'.
    kf31: NULL, '\E[18;5~'.
    kf32: NULL, '\E[19;5~'.
    kf33: NULL, '\E[20;5~'.
    kf34: NULL, '\E[21;5~'.
    kf35: NULL, '\E[23;5~'.
    kf36: NULL, '\E[24;5~'.
    kf37: NULL, '\E[1;6P'.
    kf38: NULL, '\E[1;6Q'.
    kf39: NULL, '\E[1;6R'.
    kf4: '\E[14~', '\EOS'.
    kf40: NULL, '\E[1;6S'.
    kf41: NULL, '\E[15;6~'.
    kf42: NULL, '\E[17;6~'.
    kf43: NULL, '\E[18;6~'.
    kf44: NULL, '\E[19;6~'.
    kf45: NULL, '\E[20;6~'.
    kf46: NULL, '\E[21;6~'.
    kf47: NULL, '\E[23;6~'.
    kf48: NULL, '\E[24;6~'.
    kf49: NULL, '\E[1;3P'.
    kf50: NULL, '\E[1;3Q'.
    kf51: NULL, '\E[1;3R'.
    kf52: NULL, '\E[1;3S'.
    kf53: NULL, '\E[15;3~'.
    kf54: NULL, '\E[17;3~'.
    kf55: NULL, '\E[18;3~'.
    kf56: NULL, '\E[19;3~'.
    kf57: NULL, '\E[20;3~'.
    kf58: NULL, '\E[21;3~'.
    kf59: NULL, '\E[23;3~'.
    kf60: NULL, '\E[24;3~'.
    kf61: NULL, '\E[1;4P'.
    kf62: NULL, '\E[1;4Q'.
    kf63: NULL, '\E[1;4R'.
    khome: '\E[1~', '\EOH'.
    유형: '\E[B', '\E[1;2B').
    크리: '\E[A', '\E[1;2A'.
    kspd: '^Z', NULL.
    mc0: NULL, '\E[i'.
    mc4: NULL, '\E[4i'.
    mc5: NULL, '\E[5i'.
    meml: NULL, '\El'.
    메모리: NULL, '\Em'.
    mgc: NULL, '\E[?69l'.
    넬: '\r\n', NULL.
    oc: '\E]R', '\E]104\007'.
    ritm: NULL, '\E[23m'.
    rmacs: '^O', '\E(B'.
    rmcup: '\E[2J\E[?47l', '\E[?1049l\E[23;0;0t'.
    rmm: NULL, '\E[?1034l'.
    rmpch: '\E[10m', NULL.
    rs1: NULL, '\Ec\E]104\007'.
    rs2: '\E'.
    s0ds: '\E[10m', NULL.
    s1ds: '\E[11m', NULL.
    s2ds: '\E[12m', NULL.
    sgr: '\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4% t;5%;m%?%p9%t\016%e\017%;', '%?%p9%t\E(0%e\E(B%;\E[0%?%p6% t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;% ?%p7%t;8%;m'.
    sgr0: '\E[m\017', '\E(B\E[m'.
    sitm: NULL, '\E[3m'.
    smacs: '^N', '\E(0'.
    smcup: '\E[?47h', '\E[?1049h\E[22;0;0t'.
    smglr: NULL, '\E[?69h\E[%i%p1%d;%p2%ds'.
    smm: NULL, '\E[?1034h'.
    smpch: '\E[11m', NULL.
    tsl: '\E]0;', NULL.
    u8: '\E[?6c', '\E[?%[;0123456789]c'.
    Cr: NULL, '\E]112\007'.
    Cs: NULL, '\E]12;%p1%s\007'.
    MS: NULL, '\E]52;%p1%s;%p2%s\007'.
    Se: NULL, '\E[2 q'.
    Ss: NULL, '\E[%p1%d q'.
    TS: '\E]0;', NULL.
    kDC3: NULL, '\E[3;3~'.
    kDC4: NULL, '\E[3;4~'.
    kDC5: NULL, '\E[3;5~'.
    kDC6: NULL, '\E[3;6~'.
    kDC7: NULL, '\E[3;7~'.
    kDN: NULL, '\E[1;2B'.
    kDN3: NULL, '\E[1;3B'.
    kDN4: NULL, '\E[1;4B'.
    kDN5: NULL, '\E[1;5B'.
    kDN6: NULL, '\E[1;6B'.
    kDN7: NULL, '\E[1;7B'.
    kEND3: NULL, '\E[1;3F'.
    kEND4: NULL, '\E[1;4F'.
    kEND5: NULL, '\E[1;5F'.
    kEND6: NULL, '\E[1;6F'.
    kEND7: NULL, '\E[1;7F'.
    kHOM3: NULL, '\E[1;3H'.
    kHOM4: NULL, '\E[1;4H'.
    kHOM5: NULL, '\E[1;5H'.
    kHOM6: NULL, '\E[1;6H'.
    kHOM7: NULL, '\E[1;7H'.
    kIC3: NULL, '\E[2;3~'.
    kIC4: NULL, '\E[2;4~'.
    kIC5: NULL, '\E[2;5~'.
    kIC6: NULL, '\E[2;6~'.
    kIC7: NULL, '\E[2;7~'.
    kLFT3: NULL, '\E[1;3D'.
    kLFT4: NULL, '\E[1;4D'.
    kLFT5: NULL, '\E[1;5D'.
    kLFT6: NULL, '\E[1;6D'.
    kLFT7: NULL, '\E[1;7D'.
    kNXT3: NULL, '\E[6;3~'.
    kNXT4: NULL, '\E[6;4~'.
    kNXT5: NULL, '\E[6;5~'.
    kNXT6: NULL, '\E[6;6~'.
    kNXT7: NULL, '\E[6;7~'.
    kPRV3: NULL, '\E[5;3~'.
    kPRV4: NULL, '\E[5;4~'.
    kPRV5: NULL, '\E[5;5~'.
    kPRV6: NULL, '\E[5;6~'.
    kPRV7: NULL, '\E[5;7~'.
    kRIT3: NULL, '\E[1;3C'.
    kRIT4: NULL, '\E[1;4C'.
    kRIT5: NULL, '\E[1;5C'.
    kRIT6: NULL, '\E[1;6C'.
    kRIT7: NULL, '\E[1;7C'.
    kUP: NULL, '\E[1;2A'.
    kUP3: NULL, '\E[1;3A'.
    kUP4: NULL, '\E[1;4A'.
    kUP5: NULL, '\E[1;5A'.
    kUP6: NULL, '\E[1;6A'.
    kUP7: NULL, '\E[1;7A'.
    ka2: NULL, '\EOx'.
    kb1: NULL, '\EOt'.
    kb3: NULL, '\EOv'.
    kc2: NULL, '\EOr'.
    kp1: '\EOq', NULL.
    kp2: '\EOr', NULL.
    kp3: '\EOs', NULL.
    kp4: '\EOt', NULL.
    kp5: '\EOu', '\EOE'.
    kp6: '\EOv', NULL.
    kp7: '\EOw', NULL.
    kp8: '\EOx', NULL.
    kp9: '\EOy', NULL.
    kpADD: '\EOl', '\EOk'.
    kpCMA: NULL, '\EOl'.
    kpDIV: '\EOQ', '\EOo'.
    kpMUL: '\EOR', '\EOj'.
    kpNUM: '\EOP', NULL.
    kpSUB: '\EOS', '\EOm'.
    rmxx: NULL, '\E[29m'.
    smxx: NULL, '\E[9m'.

관련 정보