LC_CTYPE 的有效值?
我在各種論壇上發現了許多問題,Mac 使用者
locale
在通過 SSH 登錄 Linux 系統時抱怨錯誤LC_CTYPE=UTF-8
設置不正確。更詳細地說,MacOS 上的 shell 似乎設置了這個值,然後(如果你在終端中啟用了該選項等)
LC_*
當你 SSH 進入時,你的本地變數被導出到遠端系統。Linux 堅持
LC_CTYPE
需要將其設置為有效的語言環境(有時您可以localegen
在 Linux 系統上以管理員身份修復此問題),但UTF-8
首先不是語言環境。我的主要問題是,這是 MacOS 中的錯誤嗎?還是 Linux 堅持需要將變數設置為完全指定的語言環境名稱是錯誤的?
其次,為了能夠爭論哪一個是正確的以及為什麼,這是在哪裡指定的?
第三,這些 Mac 使用者(包括我自己)是否可以或應該做些不同的事情?
明顯的解決方法是放置類似的東西
LC_CTYPE=en_US.UTF-8
在您的 中
.bash_profile
,但這顯然只能為您的個人帳戶解決它,並硬編碼一個可能與您的其他locale
設置一致或不一致的值。
基本問題是
我的主要問題是,這是 MacOS 中的錯誤嗎?還是 Linux 堅持需要將變數設置為完全指定的語言環境名稱是錯誤的?
環境變數的POSIX頁面顯示了其他人認為 macOS 配置不正確的原因:
$$ XSI $$ 如果語言環境值具有以下形式:
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
這可以通過使用 @ 修飾符欄位擴展到選擇字典排序規則(比如);例如:
LC_COLLATE=De_DE@dict
一個實現可能支持其他格式。
如果實現無法辨識區域設置值,則行為未指定。
也就是說,他們假設 POSIX 規定了語言環境設置的語法。粗心的讀者會假設 POSIX 為環境變數定義了允許的形式,因此codeset值是可選的,而不是替代language。但是最後一個“可能”打開了一罐蠕蟲,實際上祝福了這種解釋上的差異。如果 Apple 想要提供不完全遵循該模式的有效語言環境,Apple 可以為所欲為。
@tripleee 建議Locale頁面提供了更好的資訊,但這幾乎完全是對語言環境定義的討論,而不是為互操作性提供指導(即 POSIX 的表面目標)。
這兩個頁面都沒有解決可用區域設置的差異(例如“.utf8”與“.UTF-8”)。如 POSIX 頁面所述,這些是依賴於實現的。這讓使用者唯一的解決方案是自己確定本地和遠端系統上支持哪些區域設置,並且(此處的 ssh 行為)確定如何在遠端系統上“兼容地”設置這些設置。
我沒有詳細說明誰是“對還是錯”——但同樣對這個問題感到惱火。對此的一些解決方案:
伺服器端:
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
(在我的情況下是 raspian),其中包含以下行:[ "A${LC_CTYPE}" == "AUTF-8" ] && export LC_CTYPE="${LANG}"
希望這對其他人有幫助…