web-dev-qa-db-ja.com

"-bash:警告:setlocale:LC_ALL:ロケールを変更できません(en_US.UTF-8)"

新しいUbuntu 16.04とDebian 8サーバーを実行します。 ssh経由で接続しようとすると、次の奇妙な端末出力が表示されます。数字の入った長方形を参照します。

言語設定の問題は、エンコードの問題が原因であると想定していたため、私が今述べた問題を解決しようとして自分で導入したものです。 3時間のデバッグの後、あなたの助けが必要です!

多分それはただ欠けているライブラリーですか?このようなグラフィカルな問題を探すのは大変です...

enter image description here

local@local:~$ ssh dummy@server

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jul  9 17:22:43 2016 from x590c3909.dyn.telefonica.de
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
]1337;RemoteHost=dummy@server]1337;CurrentDir=/home/patrick]1337;ShellIntegrationVersion=2;Shell=bash]133;C;]133;D;0]1337;RemoteHost=dummy@server]1337;CurrentDir=/home/patrick]133;Adummy@server:~$ ]133;B

$ PS1出力のエコー:

echo $PS1
]133;C;\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

$ TERM出力をエコーし​​ます。

echo $TERM
]133;C;xterm

編集:「ロケール」-警告は この答え によって修正されました。

5
pat-s

端末で何をしているか

"[them]内の数字を含む長方形"は、ターミナルエミュレータがシーケンスを認識しないため、ターミナル制御シーケンスを表示する方法です。具体的には:

  • Operating System Command、OSCと略されるECMA-48制御文字(C1グループには技術用)があります。 Unicode値はU + 009Dです。
  • ECMA-48は、送信するために完全にクリーンな8ビット通信パスを必要とするC1グループの文字を、U + 0080(128)未満の値の文字のみを使用するエスケープシーケンスで表すことができるメカニズムを定義します。これらの7ビットエイリアスは、8ビットクリーンでない伝送パスでC1制御文字の使用を有効にします。皮肉なことに、現在、世界は何十年もの間、主に8ビットでクリーンです。

    次の7ビットエイリアスの1つであるCSI制御文字(U + 009B)の代わりに、非常に一般的なESC [を知っていると思います。 OSC制御文字には、7ビットのエイリアスとしてESC ]があります。

  • SSH接続の遠端の何かが、OSCで始まる制御シーケンスを端末が理解することを期待しています。 7ビットのエイリアスを使用して送信しています。
  • 端末がECMA-48を完全に実装していない。 ESC ]が表示され、ESC文字の後に]文字が続くものとして扱われます。そしてそれはそれが印刷しているものです。
  • ただし、ESC文字のグリフはありません。したがって、グリフのない文字を表示するという従来のトリックにフォールバックして、その中に(最下位16ビットの)Unicodeコードポイントの16進値を持つボックスとして表示します。よく見ると、ボックスに数字001Bが表示されます。U+ 001Bの場合は、ESC文字のコードポイントです。
  • また、ESCに対して印刷されたものの「間隔」、つまり実際にtwo文字である画面上で占めるスペースを正しく処理しません。幅。したがって、ボックスを印刷した後、出力位置enoughは進みません。次に、ご覧のように、ボックスの右半分の上に]を印刷します。

なぜそうするように言われたのか

いくつかの端末エミュレータは、OSCを制御文字シーケンスイントロデューサとして認識します。それにも標準のフォームがあります。 ECMA-48§5.6は、OSCで始まり、STで終了する「制御文字列」を定義しています(U + 009C、String Terminator)。inとは何ですか?制御文字列は端末タイプ固有です。例:そのdocoから、フォントとウィンドウタイトルを設定するために、xtermがそのような制御文字列を実装していることがわかります。

ただし、この場合の制御シーケンスのformは、xtermのものではありません。むしろ

␛] 1337; CurrentDir =/home /patrick␇

これは、iTerm2が理解できるOSC制御シーケンスの形式です。 iTerm2は、OSCによって導入された一連の制御シーケンスを定義します。これは、明らかに非標準であり、iTerm2に固有のものです。それらはECMA-48制御文字列仕様に準拠していませんが、標準で述べられているように、STではなくBEL(U + 0007)で制御文字列を終了します。厳密に言うと、コントロールの内容ではSOSおよびST以外の文字が許可されているため、これはこれまで終了しないのコントロール文字列です。ストリング;また、端末はそれ以降のすべての出力を制御文字列として単純に取得するため、準拠した端末エミュレータを使用すると、表示が実質的に停止します。

(Linuxカーネルに組み込まれているターミナルエミュレーターも、標準のOSC制御文字列を実装していません。xtermdocoは、非準拠のLinuxカーネルターミナルエミュレーターまたはiTerm2フォームを使用する壊れたアプリケーションをサポートするための仕組みがあることを指摘しています。フォームここに間違いなくiTerm2がありますが、Linuxカーネルターミナルエミュレータのものではありません。)

MacintoshからiTerm2を使用している場合、SSH接続の反対側にあるものは何でも、iTerm2制御シーケンスをターミナルエミュレータに静かに送信して、シェルが何であるか、作業ディレクトリが何であるか、誰であるか、いつだかを伝えますシェルプロンプトで編集を開始したり、コマンドの実行を開始したりしたときなど。

リモートシステムでは、/端末タイプがハードワイヤードされています。常にiTerm2と通信しているという前提の下で動作させました。しかし、あなたはnowUbuntu上で実行されているターミネータ、differentdifferent制御シーケンスのセット。

実際、出力は次のように伝えています。

␛] 1337; ShellIntegrationVersion = 2; Shell =bash␇

リモートシステムにBourne Again ShellのiTerm2 "Shell Integration"をインストールしました。それを見ると、iTerm2が実際に通信している端末であることを確認するのはかなり悪いことです。

だからそれを無効にする/アンインストールします。

参考文献

  • コード化文字セットの制御機能。 ECMA-48。 ECMAインターナショナル。
  • console_codes。 Linuxマニュアルページ。 §4. 2015。
  • マシューフリーマン、ジョージナックマン、ジェームズA.ローゼン。独自のエスケープコード。 iTerm2のドキュメント。
  • マシューフリーマン、ジョージナックマン、ジェームズA.ローゼン。シェル統合。 iTerm2のドキュメント。
9
JdeBP

sshコマンドの前に別のLC_ALLを付けてみてください。

LC_ALL=C ssh dummy@server
2
kenorb