Internet Info, s.r.o. Lupa Root Měšec Podnikatel DigiZone Slunečnice Vitalianew Bomba Navrcholu Weblogy Jagg Woko Dobrý web Computer.cz SK: MojeLinky
Root.czBlogyBrain Dump

Globální proměnné prostředí

Tomáš Ehrlich, 29. 10. 2008, 23:03 v kategorii Linux, štítky: , ,

Jak říká můj linuxový guru, vždycky mám něco speciálního. Tentokrát dělaly problém locales.

Používám Debian, testovací větev. Příhlašuji se pomocí Qingy.

Soubory jsem nastavil:
/etc/locale.gen
cs_CZ.UTF-8 UTF-8
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8
fr_FR.UTF-8 UTF-8

/etc/default/locale
LANG="cs_CZ.UTF-8"

Nechal vygenerovat locales (locale-gen).

A přesně tady se můj osud liší od bežného spokojeného linuxového uživatele. Po přihlášení mám všude POSIX... Cpát to do .zshrc (popř. .bashrc) je zrůdnost, protože pak locales fungují jen v terminálu, programy stále používají POSIX (spouštět všechny programy z terminálu je zrůdnost ještě větší).
Většína howtu mi řekla, ať uďělám to, co jsem už dávno udělal... S GDM vše fungovalo správně. Až jsem se jednoho dne naštval a spustil cd /etc && sudo grep -r locale *

Zakopaný pes byl v konfiguračních souborech v adresáří /etc/pam.d

Tyto dva řádky mi tam chyběly:

session required pam_env.so readenv=1 # nacte /etc/environment
session required pam_env.so readenv=1 envfile=/etc/default/locale # nacte specificky soubor

Chápu, že to nejspíš všichni znáte, ale kdyby se objevil někdo stejně hloupý jako já, tak ať zbytečně negrepuje :)

P.s: Při pročítání konfiguráků PAM jsem zjistil další zajímavou vychytávku: Pokud obsahuje řádek auth required pam_nologin.so a vytvoříte soubor /etc/nologin (klidně prázdný), do systému se příhlásí pouze root. Na desktopu to asi nevyužiju, ale přišlo mi to tak super, že jsem se o to musel s někým podělit :)

P.s.s: Pro lepší pochopení locales doporučuji přečíst komentář č.8 od Stanislava Brabce. Zároveň mu děkuji za vysvětlení.

Komentáře (9)

  1. 30. 10. 2008, 14:10 Stanislav Brabec napsal:

    Nastavením LC_ALL="cs_CZ.UTF-8" v systémovém prostředí si říkáte o problémy. Až nějaký skript použije třeba "LC_NUMERIC=C printf %f 3.14", budete se divit, že to nefunguje. Jak by mohlo. LC_ALL říká: "Ignoruj LC_NUMERIC. Já vím lépe, jaké locale máš použít!"

  2. 30. 10. 2008, 19:11 Yossarian napsal:

    tyto radky chybelY

  3. 30. 10. 2008, 21:36 Tomáš Ehrlich napsal:

    Každá rada dobrá. Dík za obě :)

  4. 30. 10. 2008, 23:35 Jirka napsal:

    Ja mam v /etc/profile nastaveno:

    export LANG="en_US.UTF-8"
    export LC_ALL="en_US.UTF-8"

    a vse se zda, ze funguje jak ma. O promenne LC_NUMERIC slysim poprve. Miluji kazdy den, kdy se priucim necemu novemu (nastesti skoro kazdy den :o )).

  5. 31. 10. 2008, 10:13 Tomáš Ehrlich napsal:

    /etc/profile jsem taky zkoušel, bohužel bez očekávaného výsledku. Navíc si myslím, že tento soubor používá shell a učinek by měl být tedy stejný, jako bych to hodil do .${SHELL}rc...

  6. 31. 10. 2008, 12:27 Jirka P napsal:

    5: To je divný, já nastavuji proměnné (EDITOR a MANPATH) v ~/.profile a funguje to dobře, včetně loginu do X přes gdm. Takže je to nespíš specifické pro to Qingy a bylo by nejlepší poslat bugreport (nebo aspoň wishlist), aby ten soubor respektoval. Ono totiž ~/.profile je jediná možnost jak si nastavit třeba PATH, pokud nemáte roota.

  7. 31. 10. 2008, 12:39 Tomáš Ehrlich napsal:

    Jak jsem psal, pres GDM mi vse fungovalo... Je mozne, ze jine distribuce po prihlaseni nacitaji /etc/profile (resp. ~/.profile). Debian vetsinou nacita /etc/environment a /etc/default/locale.. Pravda, zatim jsem nepremyslel, jak to nastavit pro kazdeho usera jinak, ale ~/.profile mi to urcite nebral... Tento problem jsem resil nekolik tydnu, protoze jsem na to nemel cas a vyzkousel opravdu nespocet moznosti. Podivejte se schvalne na /etc/pam.d/gdm (ale nezarucuju, ze v jinych distribucich jsou i tyto konfiguraky na stejnem miste), melo by tam byt nacteni promennych...

  8. 31. 10. 2008, 12:54 Stanislav Brabec napsal:

    Ještě upřesním:

    Pro chod běžného prostředí stačí LANG. Ta říká: nastav vše podle LANG, pokud není určeno jinak. Takže LANG=cs_CZ.UTF-8 nastaví vše na češtinu, a například LANG=cs_CZ.UTF-8 LC_MESSAGES=en_US.UTF-8 nastaví české locale na vše kromě překladů zpráv.

    LC_ALL je proměnná, která říká: Ignoruj všechny hodnoty v ostatních proměnných, a použij to, co je v LC_ALL. Je to proměnná vhodná pro autory skriptů, když chtějí mít jistotu, že je vše nastaveno podle jejich představ. Pokud je nastavena v systémovém prostředí, zablokuje možnost změnit určitý aspekt locale pomocí výše uvedených proměnných.

    Ještě dodávám, že LANG má navíc zvláštní význam: Není použit jenom pro locale. Některé programy ho čtou a analyzují, aby vybraly správné nastavení (např. písma). Pokud je locale nastaveno pomocí ostatních proměnných, ale LANG chybí, locale sice funguje, ale tyto programy jsou zmateny. Mezi takto se chovající programy patří např. Xlib nebo gtk1.

  9. 31. 10. 2008, 14:55 Jirka P napsal:

    7: To nemá s distribucí nic společného. GDM nenastavuje ty proměnné přes PAM, ale tím, že v souboru /etc/gdm/Xsession je mimo jiné

    test -f /etc/profile && . /etc/profile
    test -f "$HOME/.profile" && . "$HOME/.profile"

    Takže pokud to quingy nedělá, tak buď má nějaký svůj konfigurák, anebo ne a pak by ho měl mít. Znásilňovat kvůli takové drobné změně globální konfiguraci je špatné z několika důvodů:

    - těžko budete odlišovat jednotlivé uživatele
    - je nespecifikované, jak vytvořit funkci, nemůžete spustit jiné příkazy
    - změněné soubory jsou conffiles nějakých balíčků, tudíž vás to bude prudit při aktualizacích

K tomuto spotu není povoleno přidávání komentářů.