Come modificare la variabile di ambiente locale?


18

Ho generato i file di localizzazione en_US.utf8 , et_EE.iso88591 e ru_RU.utf8 . Ora, se provo a cambiare una qualsiasi delle variabili locali in ru_RU.utf8 o en_US.utf8 , questo non ha alcun effetto:

# 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"
# 

Tuttavia, se cambio la variabile LANG = , allora tutte le altre variabili tranne LANGUAGE = e LC_ALL = prendono il valore della variabile LANG = . C'è un modo per modificare ciascuna variabile locale separatamente? Inoltre, posso correggere che le variabili di locale non sono normali variabili di shell, ma più come parametri per l' utilità di locale ?

Risposte:


15

Puoi impostare qualsiasi categoria di locale in modo indipendente. LANGsi applica solo alle categorie che non sono esplicitamente impostate.

LANGe LC_xxxsono normali variabili d'ambiente. Non sono impostazioni per l' localeutilità: il localeprogramma non è coinvolto nell'elaborazione di alcuna locale, è solo una piccola utility per segnalare le impostazioni locali correnti e disponibili.

Quando scrivi LC_TIME=ru_RU.utf8, questo non imposta una variabile di ambiente, ma solo una variabile di shell. Le variabili della shell sono interne alla shell, non sono viste da altri programmi. Le variabili d'ambiente, d'altra parte, sono ereditate dai programmi che avvia la shell. È necessario esportare anche la variabile nell'ambiente:

$ 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"

o direttamente

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

"LANG e LC_xxx sono normali variabili d'ambiente" Come fai a saperlo LANGe LC_xxxsono variabili d'ambiente? miei spettacoli test che solo LANGe LANGUAGEed LC_MESSAGESe LC_ALLsono variabili d'ambiente, mentre le altre variabili come LC_CTYPEe LC_MONETARYnon sono variabili d'ambiente (anche, non sono variabili di shell)?
rony_t,

@rony_t Puoi consultare il codice sorgente di applicazioni e librerie, consultare la loro documentazione o sperimentare con loro. Ad esempio, compila env LC_TIME=en_GB datecon env LC_TIME=fr_FR datee env PATH="$PATH" date(ovviamente, scegli le localizzazioni esistenti sul tuo sistema). Ovviamente, ogni variabile può o non può essere impostata nell'ambiente di un dato processo. Che test hai fatto? Sei sicuro che l'applicazione che hai utilizzato si comporti in modo diverso in base LC_CTYPE(abbastanza comune) e LC_MONETARY(piuttosto raro)?
Gilles 'SO- smetti di essere malvagio'

Nel terminale, ho eseguito il printenvcomando per elencare le variabili di ambiente di bash, e solo LANGe LANGUAGEed LC_MESSAGESe LC_ALLsono state elencate come variabili di ambiente. Ho anche eseguito il comando set -o posixseguito dal comando setper ottenere le variabili di ambiente e le variabili di shell di bash, e solo LANGed LANGUAGEe LC_MESSAGESed e LC_ALLsono stati elencati. Quindi questo significa che LANGe LANGUAGEed LC_MESSAGESe LC_ALLsono variabili di ambiente e il resto delle variabili di locale non lo sono, e anche loro non sono variabili di shell.
rony_t,

@rony_t No. Significa che si aver impostato le variabili d'ambiente LANG, LANGUAGE, LC_MESSAGESe LC_ALL. (O lo hai fatto esplicitamente o la tua distribuzione o l'amministratore di sistema l'ha fatto per te.) Puoi impostare una variabile d'ambiente con qualsiasi nome (sintatticamente valido)! Ma alcuni nomi sono significativi per alcune applicazioni e altri non lo sono. LC_MESSAGES, LC_CTYPE, LC_TIMEE così via sono utilizzati dalle applicazioni che si preoccupano per la lingua dei messaggi di errore, la codifica dei caratteri, il formato dell'ora, e così via.
Gilles 'SO- smetti di essere malvagio'

@rony_t A proposito la tua configurazione è molto strana. L'impostazione di LC_ALLsovrascrive tutte le altre impostazioni, quindi il valore delle altre variabili locali non ha importanza. Normalmente viene utilizzato solo temporaneamente per forzare un programma a utilizzare una determinata locale, non ha senso averlo nel normale ambiente.
Gilles 'SO- smetti di essere malvagio'

6

Sotto le distro basate su Fedora / CentOS / RHEL credo che tu possa cambiare le impostazioni locali in una delle impostazioni locali visualizzate quando esegui il locale -acomando in questo file di sistema:

/etc/sysconfig/i18n

Ad esempio sul mio sistema Fedora 14:

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

Sotto GNOME puoi eseguire l'app di aiuto:

system-config-language

Il che fa apparire questa GUI:

             ss di lang.  gui

Penso che sia leggermente diverso per le distro Debian / Ubuntu. Credo che sia questo file:

/etc/default/locale

Credo che siano variabili d'ambiente ma non sono del tutto sicuro di come le applicazioni possano utilizzarle, se non del tutto.

Riferimenti


4

Almeno su RedHat 6, notare che se è impostato LC_ALL, l'impostazione di altre variabili d'ambiente LC_ * non avrà alcun effetto, poiché LC_ALL ha la precedenza su tutte le altre variabili d'ambiente 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=

1

Nei sistemi Debian, si può eseguire dpkg-reconfigure localesper impostare la lingua principale e renderne disponibili altri; quindi è possibile eseguire update-localeper impostare la LANGUAGEvariabile di ambiente in modo /etc/default/localeche abbia le lingue di fallback.


2
dpkg-reconfigure locales, nolocale
lauriys,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.