Bagaimana cara mengubah variabel lingkungan lokal?

18

Saya telah menghasilkan file lokalisasi en_US.utf8 , et_EE.iso88591 dan ru_RU.utf8 . Sekarang jika saya mencoba mengubah variabel lokal apa pun menjadi ru_RU.utf8 atau en_US.utf8 , maka ini tidak berpengaruh:

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

Namun, jika saya mengubah variabel LANG = , maka semua variabel lain kecuali LANGUAGE = dan LC_ALL = mengambil nilai LANG = variabel. Apakah ada cara untuk memodifikasi setiap variabel lokal secara terpisah? Selain itu, apakah saya benar bahwa variabel lokal bukan variabel shell biasa, tetapi lebih seperti parameter untuk utilitas lokal ?

Martin
sumber

Jawaban:

15

Anda dapat mengatur kategori lokal apa pun secara independen. LANGhanya berlaku untuk kategori yang tidak ditetapkan secara eksplisit.

LANGdan LC_xxxmerupakan variabel lingkungan biasa. Mereka bukan pengaturan untuk localeutilitas: localeprogram tidak terlibat dalam pemrosesan lokal apa pun, itu hanya utilitas kecil untuk melaporkan pengaturan lokal saat ini dan tersedia.

Saat Anda menulis LC_TIME=ru_RU.utf8, ini tidak menetapkan variabel lingkungan, hanya variabel shell. Variabel Shell internal ke shell, mereka tidak terlihat oleh program lain. Variabel lingkungan, di sisi lain, diwarisi oleh program yang dimulai shell. Anda perlu mengekspor variabel ke lingkungan juga:

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

atau langsung

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
"LANG dan LC_xxx adalah variabel lingkungan biasa" Bagaimana Anda tahu itu LANGdan LC_xxxmerupakan variabel lingkungan? pengujian saya menunjukkan bahwa hanya LANGdan LANGUAGEdan LC_MESSAGESdan LC_ALLmerupakan variabel lingkungan, sedangkan variabel lain suka LC_CTYPEdan LC_MONETARYbukan variabel lingkungan (juga, mereka bukan variabel shell)?
rony_t
@rony_t Anda dapat melihat kode sumber aplikasi dan pustaka, melihat dokumentasinya, atau bereksperimen dengan mereka. Misalnya, kompilasi env LC_TIME=en_GB datedengan env LC_TIME=fr_FR datedan env PATH="$PATH" date(jelas, pilih lokal yang ada di sistem Anda). Jelas, setiap variabel dapat diatur atau tidak dalam lingkungan proses yang diberikan. Pengujian apa yang Anda lakukan? Apakah Anda yakin aplikasi yang Anda gunakan berperilaku berbeda berdasarkan LC_CTYPE(cukup umum) dan LC_MONETARY(sangat jarang)?
Gilles 'SANGAT berhenti menjadi jahat'
Di terminal, saya mengeksekusi printenvperintah untuk daftar variabel lingkungan bash, dan hanya LANGdan LANGUAGEdan LC_MESSAGESdan LC_ALLterdaftar sebagai variabel lingkungan. Saya juga dieksekusi perintah set -o posixdiikuti dengan perintah setuntuk mendapatkan variabel lingkungan dan variabel shell bash, dan hanya LANGdan LANGUAGEdan LC_MESSAGESdan LC_ALLtelah dicatatkan. Jadi ini berarti bahwa LANGdan LANGUAGEdan LC_MESSAGESdan LC_ALLmerupakan variabel lingkungan dan variabel lokal lainnya tidak, dan juga mereka bukan variabel shell.
rony_t
@rony_t No Ini berarti bahwa Anda telah mengatur variabel lingkungan LANG, LANGUAGE, LC_MESSAGESdan LC_ALL. (Entah Anda melakukan ini secara eksplisit atau distribusi Anda atau administrator sistem Anda melakukannya untuk Anda.) Anda dapat mengatur variabel lingkungan dengan nama apa pun (valid secara sintaksis)! Tetapi beberapa nama bermakna untuk beberapa aplikasi, dan beberapa nama tidak. LC_MESSAGES, LC_CTYPE, LC_TIMEDan sebagainya digunakan oleh aplikasi yang peduli tentang bahasa pesan kesalahan, pengkodean karakter, format waktu, dan sebagainya.
Gilles 'SANGAT berhenti menjadi jahat'
@rony_t Omong-omong konfigurasi Anda sangat aneh. Pengaturan LC_ALLmengabaikan semua pengaturan lainnya, sehingga nilai variabel lokal lainnya tidak masalah. Biasanya hanya digunakan sementara untuk memaksa program menggunakan lokal yang diberikan, tidak masuk akal untuk memilikinya di lingkungan normal Anda.
Gilles 'SANGAT berhenti menjadi jahat'
6

Di bawah distro berbasis Fedora / CentOS / RHEL saya percaya Anda dapat mengubah lokal ke salah satu lokal yang ditampilkan ketika Anda menjalankan locale -aperintah di file sistem ini:

/etc/sysconfig/i18n

Misalnya pada sistem Fedora 14 saya:

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

Di bawah GNOME Anda dapat menjalankan aplikasi bantuan:

system-config-language

Yang memunculkan GUI ini:

             ss dari lang.  gui

Saya pikir ini sedikit berbeda untuk distro Debian / Ubuntu. Saya yakin ini file ini:

/etc/default/locale

Saya percaya mereka adalah variabel lingkungan tetapi tidak sepenuhnya yakin bagaimana aplikasi memanfaatkannya.

Referensi

slm
sumber
4

Pada RedHat 6 setidaknya, perhatikan bahwa jika LC_ALL diatur, maka pengaturan variabel lingkungan LC_ * lainnya tidak akan berpengaruh, karena LC_ALL lebih diutamakan daripada semua variabel lingkungan LC_ * lainnya.

[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
sumber
1

Dalam sistem Debian, seseorang dapat menjalankan dpkg-reconfigure localesuntuk mengatur bahasa utama dan membuat yang lain tersedia; maka seseorang dapat menjalankan update-localeuntuk mengatur LANGUAGEvariabel lingkungan /etc/default/localeuntuk memiliki bahasa fallback.

lfd
sumber
2
dpkg-reconfigure locales, tidaklocale
lauriys