Jak zmienić zmienną środowiskową locale?

18

Wygenerowałem pliki lokalizacyjne en_US.utf8 , et_EE.iso88591 i ru_RU.utf8 . Teraz, jeśli spróbuję zmienić dowolną zmienną ustawień regionalnych na ru_RU.utf8 lub en_US.utf8 , nie będzie to miało żadnego wpływu:

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

Jeśli jednak zmienię zmienną LANG = , wówczas wszystkie inne zmienne oprócz LANGUAGE = i LC_ALL = przyjmują wartość zmiennej LANG = . Czy istnieje sposób na zmodyfikowanie każdej zmiennej ustawień narodowych osobno? Ponadto, czy mam rację, że zmienne regionalne nie są zwykłymi zmiennymi powłoki, ale bardziej przypominają parametry użyteczne w locale ?

Jaskółka oknówka
źródło

Odpowiedzi:

15

Możesz ustawić dowolną kategorię ustawień regionalnych niezależnie. LANGdotyczy tylko kategorii, które nie są jawnie ustawione.

LANGi LC_xxxsą zwykłymi zmiennymi środowiskowymi. Nie są to ustawienia localenarzędzia: localeprogram nie bierze udziału w przetwarzaniu ustawień regionalnych, to tylko małe narzędzie do zgłaszania bieżących i dostępnych ustawień regionalnych.

Kiedy piszesz LC_TIME=ru_RU.utf8, nie ustawia to zmiennej środowiskowej, tylko zmienną powłoki. Zmienne powłoki są wewnętrzne dla powłoki, nie są widziane przez inne programy. Z drugiej strony zmienne środowiskowe są dziedziczone przez programy uruchamiane przez powłokę. Musisz także wyeksportować zmienną do środowiska:

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

lub bezpośrednio

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"
Gilles „SO- przestań być zły”
źródło
„LANG i LC_xxx to zwykłe zmienne środowiskowe” Skąd to wiesz LANGi LC_xxxczy zmienne środowiskowe? moich testów wynika, że tylko LANGi LANGUAGEi LC_MESSAGESi LC_ALLsą zmienne środowiskowe, podczas gdy inne zmienne, jak LC_CTYPEi LC_MONETARYnie są zmienne środowiskowe (również nie są one zmienne powłoki)?
rony_t
@rony_t Możesz przeglądać kod źródłowy aplikacji i bibliotek, przeglądać ich dokumentację lub eksperymentować z nimi. Na przykład, compate env LC_TIME=en_GB datez env LC_TIME=fr_FR datei env PATH="$PATH" date(oczywiście, wybrać lokalizacje, które istnieją w systemie). Oczywiście, każda zmienna może, ale nie musi być ustawiona w środowisku danego procesu. Jakie testy wykonałeś? Czy na pewno używana aplikacja zachowuje się inaczej w zależności od LC_CTYPE(dość powszechnego) i LC_MONETARY(dość rzadkiego)?
Gilles „SO- przestań być zły”
W terminalu wykonałem printenvpolecenie, aby wyświetlić zmienne środowiskowe bash, i tylko LANGi LANGUAGEi LC_MESSAGESi LC_ALLzostały wymienione jako zmienne środowiskowe. Ja również wykonywane polecenia set -o posixnastępuje przez polecenie set, aby uzyskać zmienne środowiskowe oraz zmienne powłoki bash, a tylko LANGi LANGUAGEi LC_MESSAGESi LC_ALLzostały wymienione. Więc oznacza to, że LANGi LANGUAGEi LC_MESSAGESi LC_ALLsą zmienne środowiskowe i reszta zmiennych locale nie są, a także nie są zmienne powłoki.
rony_t
@rony_t Nie oznacza to, że masz już ustawione zmienne środowiskowe LANG, LANGUAGE, LC_MESSAGESi LC_ALL. (Albo zrobiłeś to jawnie, albo twoja dystrybucja, albo administrator systemu zrobił to za ciebie.) Możesz ustawić zmienną środowiskową pod dowolną (poprawną składniowo) nazwą! Ale niektóre nazwy mają znaczenie dla niektórych aplikacji, a niektóre nie. LC_MESSAGES, LC_CTYPE, LC_TIMEI tak dalej są używane przez aplikacje, które dbają o język komunikatów o błędach, kodowania znaków, format czasu, i tak dalej.
Gilles „SO- przestań być zły”
@rony_t Nawiasem mówiąc, twoja konfiguracja jest bardzo dziwna. Ustawienie LC_ALLzastępuje wszystkie pozostałe ustawienia, więc wartość innych zmiennych regionalnych nie ma znaczenia. Zwykle jest używany tylko tymczasowo, aby zmusić program do korzystania z danych ustawień regionalnych, nie ma sensu mieć go w normalnym środowisku.
Gilles „SO- przestań być zły”
6

W ramach dystrybucji opartych na Fedorze / CentOS / RHEL uważam, że możesz zmienić ustawienia regionalne na jeden z ustawień regionalnych wyświetlanych po uruchomieniu locale -apolecenia w tym pliku systemowym:

/etc/sysconfig/i18n

Na przykład w moim systemie Fedora 14:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

W GNOME możesz uruchomić aplikację pomocy:

system-config-language

Które wyświetla ten GUI:

             ss of lang.  gui

Myślę, że jest nieco inaczej w przypadku dystrybucji Debian / Ubuntu. Myślę, że to ten plik:

/etc/default/locale

Uważam, że są to zmienne środowiskowe, ale nie do końca pewne, w jaki sposób aplikacje z nich korzystają, jeśli w ogóle.

Bibliografia

slm
źródło
4

Przynajmniej na RedHat 6, zauważ, że jeśli ustawione jest LC_ALL, to ustawienie innych zmiennych środowiskowych LC_ * nie przyniesie żadnego efektu, ponieważ LC_ALL ma pierwszeństwo przed wszystkimi innymi zmiennymi środowiskowymi LC_ *.

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=
Kiwicmc
źródło
1

W systemach Debian można uruchomić, dpkg-reconfigure localesaby ustawić główny język i udostępnić inne; następnie można uruchomić, update-localeaby ustawić LANGUAGEzmienną środowiskową w tak, /etc/default/localeaby miała języki zastępcze.

lfd
źródło
2
dpkg-reconfigure locales, nielocale
lauriys