Neredeyse her program yerel ayarlarımdan şikayet ediyor?


29

Arch Linux kullanıyorum ve viki üzerindeki yerel ayarları belirleme hakkındaki talimatları izledim .

Neredeyse çalışan her program yerelden - hatta şikayet ediyor locale. Bu gibi görünüyor:

% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=

veya:

% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "en-US",
    LC_NUMERIC = "en-US",
    LC_MONETARY = "en-US",
    LC_MEASUREMENT = "en-US",
    LC_CTYPE = "en_US.UTF-8",
    LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")

Biraz kafa karıştırıcı olan şey, /etc/locale.genbunun birkaç örneğinin olması; tüm UTF-8 satırlarında "bir şey.UTF-8" bulunur ve çalışırken locale-gengösterir en_US.UTF-8... done, ancak locale -akullanılabilir yerel gösterileri göstermesi beklenir en_US.utf8. Ben her iki biçimlerinin çeşitli kombinasyonları denedim /etc/locale-genve LOCALE=içinde /etc/rc.conf, ama hiçbir şey problem belirlemiştir.

Ek bilgi:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

Bruce Ediger'in ayar önerisi LANG=Cve LC_ALL=en_US.UTF-8çalışması önerdi (aslında ayar LC_ALLdüzeltildi, ayar LANGönemli değildi), ama neler olduğunu bilmek istiyorum. Göre SUS o null adlı ayarlayabilir ve değilse, LC_ALL tüm diğer LC_ * değişkenleri geçersiz kılar. Sistemimde ayarlandı, ancak boş, bu nedenle göz ardı edilmeli ve bunun yerine başka değerler kullanılmalı. Olan bu değil , başka bir çağrının iyi bir dize döndürmesi durumunda bile uygulamaların çağrıda setlocalebulunduğu LC_ALL, NULLgeri döndüğü ve hata ürettiği anlaşılıyor setlocale.

İşte bir üst kısmıdır ltraceait locale(işlev dönüş değerleri görmek için kaydırma hakkı)

% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510)                                                                      = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "")                                                                                   = "en_US.UTF-8"
setlocale(5, "")                                                                                   = "en_US.UTF-8"
textdomain("libc")                                                                                 = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4)                                         = 0
setlocale(6, "")                                                                                   = NULL
dcgettext(0, 0x405aa8, 5, 0, 0)                                                                    = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)  

çıktısını paylaşabilir misin locale -a?
njsg

Sana kullanması gerektiğini noktasına gidiyordu .utf8içinde LOCALEve LC_*fakat görünüşe .UTF-8şöyle tr için ... burada da çalışır: o (olmadan görünmüyor .utf8olarak) locale -a?
njsg

1
Yap export LANG=Cve export LC_ALL=en_US.UTF-8ne olduğunu gör. Arch linux dizüstü bilgisayarımda LOCALE="en_US.UTF-8"/etc/rc.conf dosyası var ve dizüstü bilgisayarımın LANG = C değerini nerede belirlediğini bulamıyorum.
Bruce Ediger

İçeriğini gönderebilir misin /etc/locale.conf? Yanlışlıkla LANG=en-US(kısa çizgi ile) yerine (kısa çizgi ile) yazmış gibisiniz LANG=en_US.
Mikel

Ve içeriği /etc/locale.gende faydalı olacaktır.
Mikel

Yanıtlar:


18

Sen yokken yerel varsayılan kullanılacak bir dosyayı kaçırdığınızı $LANGveya $LC_ALL(veya tüm fazla spesifik $LC_whatever) olmak kümesi.

Daha eski glibc'de, / usr / lib / locale / locale-archive. GNU / Linux karmakarışık olduğundan, makinenizde kullanılan belirli sürümlerde hangi dosyaların beklendiğini belirlemek için strace'i kullanmalısınız:

strace -e dosyası yerel ayarı
execve ("/ usr / bin / yerel ayar", ["yerel ayar"], [/ * 36 vars * /]) = 0
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Böyle bir dosya veya dizin yok)
açık ("/ etc / ld.so.cache", O_RDONLY) = 3
açık ("/ lib / libc.so.6", O_RDONLY) = 3
açık ("/ usr / lib / yerel / yerel ayar arşivi", O_RDONLY | O_LARGEFILE) = 3

---------------------- Yorumlar 1 gün sonra eklendi:

"ltrace -S" tamam olmalı, çünkü sistem çağrıları gösteriyor.

Aksi takdirde, "ltrace" çok yararlı değildir (yani strace'e karşı verimseldir), çünkü sadece en üstteki çağrıları gösterir. Bunlar açıktır (setlocale (3)), asıl sorun libc içinde gerçekleşir.

Eğer olduğu anlaşılıyor ham en_US.UTF-8 eser beri yüklü yerel verileri.

Öyleyse, bunun gibi bir şey sorununuzu çözmeli ve sistem genelinde bir varsayılan ayar yapmalıdır:

localedef -f UTF-8 -i en_US en_US.UTF-8

sudo localedef -f UTF-8 -i en_US en_US.UTF-8Raspbian 2018-11-13 Lite'ta çalışıyor.
Ciro Santilli,

6

/etc/locale.confHemen bugün kurduktan sonra da aynı sorunu yaşadım (son değişiklikler ile ilgili olarak /etc/rc.conf. Benim durumumda, yerellerin kurulmadığı ortaya çıktı.)

Kontrol edin /etc/locale.gen. Ortam değişkenlerinin referans aldığı tüm yerel ayarların orada aktifleştirilmesi (yorum yapılmaması). Değişikliklerinizi yaptıktan sonra sudo locale-gen, seçilen yerel ayarları yüklemek için çalıştırın .


2

Bu bağlantıyı takip etmek sorunumu çözdü:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

/etc/locale.confbu sorunu gideren bir dosya oluşturur


1

Son zamanlarda benzer sorunlar yaşadım, yanlışlıkla 'LOCALE = en_US.utf8' yazısını kaldırdığımda tüm unicode dosya adları yanlış görüntüleniyordu /etc/rc.conf. Bu yüzden boot betiğini kontrol ettim:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

Basit bir çözüm, hem kontrol etmektir DAEMON_LOCALEve LOCALEde /etc/rc.confemin ilki değildi yapmak nove ikincisi boş değildi.


-1

Belki ayarlarınızdan biri geçersizdir? Bunlar referans için yerel ayarlarım; hataya neden olmazlar (KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.