ターミナルエミュレータとその中で実行されているシェルが異なる用語タイプを使用している場合、どのような「悪い」ことが起こりますか(そしてなぜ)?

ターミナルエミュレータとその中で実行されているシェルが異なる用語タイプを使用している場合、どのような「悪い」ことが起こりますか(そしてなぜ)?

たとえば、PuTTY設定では端末タイプをに設定しましたが、SSHログイン後にxterm-256colorシェルで変更しました。export TERM=linux

私はそれがほとんどの場合うまく動作することを知っています。 PuTTYとリモートシェルの間の矛盾が実際に技術的な観点から何を意味するのかを理解しようとしています。

答え1

このTERM変数は、ターミナル/エミュレータの機能と色の変更、カーソルの移動、または画面の消去などのターミナル制御機能のために送信する正しいコードを見つけるために使用されます。

理論的には、TERMこの変数によって識別される端末タイプは、/usr/share/terminfo/ディレクトリツリーの端末タイプ記述によって正確に記述されます。実際には、ターミナルエミュレータには、その動作がタイプ仕様から外れるようにするバグがあるかもしれません。

(端末の種類仕様自体にもバグがある可能性がありますが、これは非常に古い技術であり、ほとんどのバグはずっと前に解決されました。)

たとえば、端末は母国語で通信します。アプリケーションは通常、これを直接話すことなく使用します。用語情報データベースは辞書/フレーズセットで端末と通信します。 TERM環境変数は、使用する辞書/フレーズを決定します。

TERM値がわずかに間違っている場合(端末タイプが正確ではないが十分に類似していることを示す場合)、berndbauschが質問のコメントで述べたように、機能が低下した場合(たとえば、256色ではなく16色のみを使用)、ほとんどの場合正常です。 。

プログラムが実際の端末タイプに存在しない機能を使用しようとすると、画面に一部のジャンク文字が表示されることがあります。エラーが反対の場合(つまり、端末タイプの説明に端末に実際に存在する機能が含まれていない場合)、プログラムは端末がその機能を使用できないように動作します。

ただし、TERM値が完全に間違っている場合(完全に関連していない端末タイプを示す)、画面の消去やその他の基本機能は使用できず、それを使用しようとすると画面にガベージ文字が生成される可能性があります。これは、プログラム端末エミュレータが実際に認識しない形式で端末制御コードを送信することです。この状態では、TERM値が変更されるまでプレーンテキストエディタ(ClassicexやErrorなどの従来の行中心エディタではない)を使用することは非常に困難または不可能です。ed

TERM値が完全に欠落している場合、それを必要とするほとんどのプログラムはデフォルト値を想定しますdumb。つまり、機能が非常に制限されている非常に古い端末であり、画面の代わりにプリンタがある可能性があります。この場合、ゴミ文字は表示されませんが、プレーンテキストエディタまたは上記の既存のビュー内でテキストベースの全画面表示(ドロップダウンまたはポップアップメニュー)を生成するすべての項目を使用して、完全に無効な用語設定と同じです。端末ウィンドウでは不可能です。

非常に古い端末を使用する例については、YouTube で CuriousMarc の動画をご覧ください。 https://youtu.be/2XLZ4Z8LpEE?t=501

CuriousMarcが変数を直接代入する代わりにこれを設定しtty33ましたが、Linuxで実際に使用できる特定のTERM値があることに注意してください。その価値はそれよりも簡単かもしれません!agettyTERMdumb

このTERMタイプの内容は、タイプ検出メカニズムとして使用できるものが必ずしもない多くの以前の技術を包括するためのものなので、最初は自動ターミナルタイプ検出に対する規定はまったくありませんでした。

getty有線シリアル端末の場合、システム管理者は新しい端末に接続されている各シリアルポートのプロセスを追加するときに正しい端末タイプを設定する必要があります。モデム回線の場合、システムは次のように構成できます。ユーザーに尋ねる正しい端末タイプを見つけるには、検出さ/etc/profileれたセッションが非対話型セッションでない限り、inまたは類似のものを入力してください。

端末タイプの自動検出にはいくつかの進歩がありましたが、これらの開発はすべての場合に適用されるわけではありません(従来の端末タイプが多すぎるため)。したがって、自動検出は、管理者が見なした場合に有効にできる選択機能のままです。必要。彼らにはそれほど価値があります。

後でネットワークプロトコルベースのリモートアクセス方法が開発されたときに追加された機能の1つは、接続時にクライアントからリモートホストにいくつかの追加情報を自動的に転送する機能でした。これらのうち、TERM値は最初のものです。 「誰もが幸せだ」

答え2

PuTTYは、「ターミナルタイプ」構成オプションのみをデフォルトのTERM環境変数として使用します。PuTTY SSH クライアントいつリモートサーバーから疑似端末を要求する

この設定を使用して端末の順序を決定します。PuTTY端末エミュレータこれを識別して解釈する方法は多少愚かです。実際、PuTTYはそのようなことはしないでください。

答え3

実際、PuTTYの動作は似たようなこの説明が作成された端末の2つの親セットでも、まったく一致するものでもありません。

端末の説明が端末と一致しない場合、いくつかの問題が発生します。

  • 端末が異なる方法で実装する機能を一覧表示すると、アプリケーションは誤動作します。
  • 端末で実装した機能を省略すると、アプリケーションはその機能を無視します。
  • 端末に実装されていない機能がリストされている場合、アプリケーションは再び誤動作します。

PuTTYに推奨される端末の説明は次のとおりです。「パテ」そして「パテ-256色」。 infocmp を使用して違いを示す場合は、次のようになります。

  • 一般的に256色をサポートする端末は8色もサポートします。各グループ内には違いがあります。 PuTTYには、カラーパレットをカスタマイズする機能が不足しているため(256色のサポートが不完全であるため)、この機能を部分的にサポートしています。
    パテとパテ-256colorを比較してみてください。
        ブール値を比較します。
        CC:ティー:F。
        数字を比較してください。
        色: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'。

もっと「パテ」オペレーティングシステムそれぞれには他の機能にはない機能があり、一部は共通機能に対して異なることを示します。

パテとLinuxを比較してみてください。
    ブール値を比較します。
    白黒:T:F。
    頻繁に。
    時間:時間:F。
    斧:F:T。
    XT:T:F。
    数字を比較してください。
    NCV:22、18。
    文字列を比較します。
    acsc:「aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~」、 '++\、\、--..00
    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'.

関連情報