Nedostal jsem se do podrobností o tom, kdo je "správný nebo špatný" - ale byl jsem tímto problémem stejně naštvaný. Některá řešení:
- Na straně serveru:
- změnit/zakázat
AcceptEnv LC_*
v/etc/ssh/sshd
- nevýhody:nastaví je na výchozí systém
- upravit
.profile
- nevýhody:jeden uživatel
- upravit
/etc/bash*
nebo/etc/profile
- nevýhody:mohou být v aktualizacích zrušeny
- změnit/zakázat
- Na straně klienta:
alias ssh="LC_CTYPE=\"${LANG}\" ssh"
v.bashrc
/.profile
/whereEver- nevýhody:jeden uživatel
- stejné jako na straně serveru v
.bashrc
/.profile
... - změnit/přidat nastavení v Terminálu
- con:celá relace, ať už místní nebo vzdálená
Nakonec jsem tedy vytvořil mac-locale-fix.sh
v /etc/profile.d
na serveru (v mém případě raspian) s tímto řádkem:
[ "A${LC_CTYPE}" == "AUTF-8" ] && export LC_CTYPE="${LANG}"
Doufám, že to pomůže ostatním...
Základní otázka zní
Moje primární otázka je, je to chyba v MacOS? Nebo se Linux mýlí, když trvá na tom, že proměnná musí být nastavena na plně specifikovaný název národního prostředí?
a stránka POSIX pro proměnné prostředí ukazuje důvod, proč ostatní považují konfiguraci macOS za nesprávnou:
[XSI] Pokud hodnota národního prostředí má tvar:
language[_territory][.codeset]
odkazuje na národní prostředí poskytované implementací, kde je nastavení jazyka, území a kódové sady definováno implementací .
LC_COLLATE
,LC_CTYPE
,LC_MESSAGES
,LC_MONETARY
,LC_NUMERIC
aLC_TIME
jsou definovány tak, aby akceptovaly další modifikátor pole @, který umožňuje uživateli vybrat konkrétní instanci lokalizačních dat v rámci jedné kategorie (například pro výběr slovníku na rozdíl od znakového řazení dat). Syntaxe těchto proměnných prostředí je tedy definována takto:[language[_territory][.codeset][@modifier]]
Pokud například uživatel chtěl pracovat se systémem ve francouzštině, ale potřeboval třídit německé textové soubory, LANG a LC_COLLATE by mohly být definovány jako:
LANG=Fr_FR LC_COLLATE=De_DE
To by mohlo být rozšířeno o výběr slovníkového řazení (řekněme) pomocí pole modifikátoru @; například:
[email protected]
Implementace může podporovat jiné formáty.
Pokud implementace nerozpozná hodnotu národního prostředí, chování není specifikováno.
To znamená, že předpokládají, že POSIX předepisuje syntaxi pro nastavení národního prostředí. Neopatrný čtenář by předpokládal, že POSIX definuje přípustné formy pro proměnné prostředí, takže kódová sada hodnota je volitelná a nenahrazuje jazyk . Ale ten poslední „květen“ otevírá plechovku červů, což ve skutečnosti požehná tomuto rozdílu ve výkladu. Apple si může dělat, co chce, pokud chce poskytovat platná národní prostředí, která se přesně neřídí tímto vzorem.
@tripleee navrhl, že stránka na Locale poskytuje lepší informace, ale to je téměř výhradně diskuse o definicích národního prostředí, spíše než poskytování pokynů pro interoperabilitu (tj. zdánlivý cíl POSIX).
Žádná stránka neřeší rozdíly v dostupných nastaveních národního prostředí (jako je ".utf8" versus ".UTF-8"). Ty jsou závislé na implementaci, jak je uvedeno na stránce POSIX. To ponechává uživatelům jediné řešení, aby si sami určili, jaká nastavení národního prostředí jsou podporována na lokálních a vzdálených systémech, a (zde chování ssh) určili, jak je nastavit na vzdáleném systému "kompatibilně".