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

新しいUbuntu 16.04およびDebian 8サーバーを実行します。 SSH経由で接続しようとしましたが、次のような奇妙な端末出力が発生しました。私はその中に数字を含む長方形に言及しています。

言語設定の問題は、前述の問題を解決しようとしている間にコーディングの問題によるものだと思ったので、自分で導入しました。 3時間デバッグした後、あなたの助けが必要です!

おそらく図書館がなくなっただけでしょうか?このグラフィックの問題は見つけるのが難しいです...

ここに画像の説明を入力してください。

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

編集:「ロケール」 - 警告この回答

ベストアンサー1

あなたの端末は何をしていますか?

「数字付きの長方形」は、端末エミュレータがシーケンスを認識しないため、端末制御シーケンスを表示する方法です。具体的には:

  • ECMA-48制御文字(グループC1、技術用)があります。オペレーティングシステムコマンド、減ってOSCと言います。 Unicode値はU + 009Dです。
  • ECMA-48は、C1グループの文字が送信に完全にクリーンな8ビット通信パスを必要とするメカニズムを定義します。これは、U + 0080(128)より小さい値を持つ文字に対してエスケープシーケンスのみを使用して表現できます。これら7桁のエイリアス8ビット以外のクリーン伝送パスでは、C1制御文字が許可されます。皮肉なことに、世界は何十年もの間、ほぼ8ビットできれいでした。

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

  • SSH接続のリモート側にある何かは、端末がOSCで始まる制御シーケンスを理解することを期待しています。 7ビットエイリアスを使用して送信します。
  • あなたの端末はECMA-48を完全に実装していません。 ESCを見て、]ESC文字の後に1文字]が続くものとして扱います。これが印刷されます。
  • しかし、ESC文字の文字の外観はありません。したがって、文字を外すことなく、文字をUnicodeコードポイント(最下位16ビット)の16進値を含むボックスとして表示する従来の方法に戻ります。詳しく見ると、ボックスに数字00とESC文字のコードポイントU + 001Bが表示されます。1B
  • また、ESC用に印刷された「間隔」、つまり画面で占めるスペースを正しく処理できません。二つ文字の幅。そのため、ボックスを印刷した後は場所をあらかじめ出力しません。十分。見てわかるように、]ボックスの右半分の上部を印刷します。

なぜこのようなことをしなければならないのですか?

一部の端末エミュレータは、OSCを制御文字シーケンスの導入者として認識します。標準フォームもあります。 ECMA-48§5.6はOSCで始まり、ST(U + 009C、文字列終端)。何ですか存在する制御文字列は端末のタイプによって異なります。たとえば、次のようになります。 xtermのdocoでフォントとウィンドウのタイトルを設定するための制御文字列を実装するのがわかります。

しかし、この場合、制御シーケンスはxterm制御シーケンスではありません。彼とは対照的に、

␛] 1337;現在のディレクトリ=/home/Patrick␇

これは、iTerm2が理解するOSC制御シーケンスの形式です。 iTerm2はOSCによって導入された一連の制御シーケンスを定義し、これはかなり非標準であり、iTerm2とは異なります。これは、ECMA-48制御文字列の仕様に従わず、標準で指定されているようにSTを使用するのではなく、BEL(U + 0007)を使用して制御文字列を終了します。厳密に言えば制御文字列です。終了したことがない、制御文字列の内容には、SOS と ST を除くすべての文字が許可され、一貫した端末エミュレータを使用して表示を効果的に停止する方法です。端末は単にすべての追加出力を制御文字列として蓄積するからです。

(Linuxカーネルに組み込まれている端末エミュレータも標準OSC制御文字列を実装していません。xterm docoは、非互換Linuxカーネル端末エミュレータまたはiTerm2形式を使用して破損したアプリケーションをサポートできることを示しています。形式は確かにiTerm2です。 Linuxカーネル端末エミュレータではありません)。

MacintoshでiTerm2を使用している場合、SSH接続のもう一方の端にあるものは、静かにiTerm2制御シーケンスをターミナルエミュレータに送信して、シェルとは何ですか?作業ディレクトリとは何ですか?いつ実行するか。コマンドの実行を開始すると、シェルプロンプトで編集を開始できます。

お持ちのリモートシステムでハードワイヤーターミナルタイプ。私は常にiTerm2を使って会話するという前提で実行しました。しかし、あなたはUbuntuで実行されているTerminatorを使用して会話します。その他端末エミュレータではその他制御順序が設定されました。

実際、出力では次のような内容も教えてくれます。

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

リモートシステムにBourne Againシェル用のiTerm2 "Shell Integration"をインストールしました。見て、iTerm2が実際に会話中の端末であることを確認するのは恐ろしいです。

そのため、無効/削除してください。

追加読書

  • 文字セットエンコーディングのための制御機能。 ECMA-48。 ECMAインターナショナル。
  • console_codes。 Linuxのマニュアルページ。 §4.2015。
  • マシュー・フリーマン、ジョージ・ナクマン、ジェームズA.ローゼン。 排他エスケープコード。 iTerm2 ドキュメント。
  • マシュー・フリーマン、ジョージ・ナクマン、ジェームズA.ローゼン。 住宅統合。 iTerm2 ドキュメント。

おすすめ記事