誰が「正しいか間違っているか」の詳細には触れませんでしたが、同じようにこの問題に悩まされていました.これに対するいくつかの解決策:
- サーバー側:
AcceptEnv LC_*
の変更/無効化/etc/ssh/sshd
で- 短所:システムのデフォルトに設定します
- 編集
.profile
- 短所:シングル ユーザー
- 編集
/etc/bash*
または/etc/profile
- 短所:アップデートで元に戻る可能性があります
- クライアント側:
alias ssh="LC_CTYPE=\"${LANG}\" ssh"
.bashrc
で /.profile
/どこでも- 短所:シングル ユーザー
.bashrc
のサーバー側と同じ /.profile
...- ターミナルで設定を変更/追加
- con:ローカルでもリモートでもセッション全体
というわけで、結局 mac-locale-fix.sh
を作ってしまいました /etc/profile.d
で 次の行を含むサーバー (私の場合はラスピアン) で:
[ "A${LC_CTYPE}" == "AUTF-8" ] && export LC_CTYPE="${LANG}"
これが他の人に役立つことを願っています...
基本的な質問は
<ブロック引用>私の主な質問は、これは MacOS のバグですか?それとも、変数を完全に指定されたロケール名に設定する必要があると主張する Linux は間違っていますか?
また、環境変数の POSIX ページには、他のユーザーが macOS 構成を正しくないと見なす理由が示されています。
<ブロック引用>[XSI] If ロケール値の形式は次のとおりです:
language[_territory][.codeset]
言語、地域、コードセットの設定が 実装定義 である実装提供のロケールを参照します。 .
LC_COLLATE
, LC_CTYPE
, LC_MESSAGES
, LC_MONETARY
, LC_NUMERIC
、および LC_TIME
は、追加のフィールド @ 修飾子を受け入れるように定義されています。これにより、ユーザーは単一のカテゴリ内で特定のローカリゼーション データのインスタンスを選択できます (たとえば、データの文字順序ではなく辞書を選択する場合)。したがって、これらの環境変数の構文は次のように定義されます:
[language[_territory][.codeset][@modifier]]
たとえば、ユーザーがフランス語でシステムとやり取りしたいが、ドイツ語のテキスト ファイルを並べ替える必要がある場合、LANG と LC_COLLATE は次のように定義できます。
LANG=Fr_FR
LC_COLLATE=De_DE
これは、@ 修飾子フィールドを使用して辞書照合 (たとえば) を選択するように拡張できます。例:
[email protected]
実装によって他の形式がサポートされる場合があります。
ロケール値が実装によって認識されない場合、動作は未規定です。
つまり、彼らは POSIX がロケール設定の構文を規定していると想定しています。不注意な読者は、POSIX が環境変数の許容される形式を定義しているため、コードセット 値はオプションであり、言語の代わりにはなりません .しかし、最後の「かもしれない」はワームの缶を開き、解釈のこの違いを事実上祝福します.そのパターンに正確に従わない有効なロケールを提供したい場合、Apple は何でもできます。
@tripleee は Locale のページがより良い情報を提供することを提案しましたが、それは 相互運用性 のガイダンスを提供するのではなく、ほとんど完全にロケール定義の議論です (つまり、POSIX の表向きの目標)。
どちらのページも、利用可能なロケール設定の違い (「.utf8」と「.UTF-8」など) については触れていません。 POSIX ページに記載されているように、これらは実装に依存します。そのため、ローカル システムとリモート システムでどのロケール設定がサポートされているかを自分で判断し、(ここでは ssh の動作) リモート システムでそれらを「互換性を持って」設定する方法を決定するという唯一の解決策がユーザーに残されます。