Comment définir un environnement local de manière non interactive sur Debian / Ubuntu?

33

Habituellement, je cours aptitude -y install localesensuite dpkg-reconfigure localespour configurer les paramètres régionaux.

Maintenant, je veux le mettre dans un script shell, comment puis-je faire de manière fiable ce qui suit, automatiquement / sans interaction?

  • Choisissez-le en_US.UTF-8et définissez-le comme système par défaut
  • Désactivez tous les autres paramètres régionaux
  • (Facultatif) Vérifiez si /etc/default/localecontient une seule et unique entrée LANG=en_US.UTF-8comme prévu
kenn
la source

Réponses:

13

Voir locale-gen :

 locale-gen --purge en_US.UTF-8

et

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Pierre
la source
1
Merci, mais je reçois File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module> sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))...
kenn
Essayez LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Stone
Ce matin, avec un état propre de VM, ça a marché! Merci!
kenn
Hmm… lorsque vous exécutez locale-gen --purge en_GB.UTF-8une installation propre, vous obtenez cette sortie inattendue: des Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.idées sur la façon de définir la liste des paramètres régionaux comme vous le faites dans dpkg-reconfigure les paramètres régionaux de manière non interactive?
Benjamin Nolan
Cela donne à la fois des erreurs d'autorisation refusées ....
Cerin
47

Impossible d'obtenir la réponse ci-dessus pour qu'elle fonctionne. Au lieu de cela, j'utilise cette méthode (pour Dockerfiles):

# Configure timezone and locale
echo "Europe/Oslo" > /etc/timezone && \
    dpkg-reconfigure -f noninteractive tzdata && \
    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    sed -i -e 's/# nb_NO.UTF-8 UTF-8/nb_NO.UTF-8 UTF-8/' /etc/locale.gen && \
    echo 'LANG="nb_NO.UTF-8"'>/etc/default/locale && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=nb_NO.UTF-8
EirikW
la source
3
Dockerfile est exactement ce dont j'avais besoin. Merci.
peedee
5
Veuillez ne pas vous référer aux autres réponses comme "ci-dessus", "ci-dessous" ou similaire. Les réponses se déplacent lorsque les gens votent pour eux, les acceptent, les suppriment ou choisissent simplement différentes commandes. Utilisez toujours le nom de la personne qui a publié la réponse, ou mieux encore, utilisez le lien de partage sous la réponse sur laquelle vous commentez pour lier explicitement la réponse.
rjmunro
Version légèrement plus soignée de cette réponse - spécifiquement pour Dockerfiles .. EDIT: puisque les sauts de ligne ne fonctionnent pas ici, veuillez vous référer à ma réponse serverfault.com/a/801162/89669
mafrosis
J'avais besoin que les en_GB.UTF-8paramètres régionaux soient configurés dans CircleCI - c'était la meilleure réponse qui fonctionnait. En espérant qu'en raison de ce commentaire, Google pourrait montrer que cela est pertinent lorsque les gens essaient de rechercher le problème que je rencontrais.
Alex Szabó
echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale est redondant avec update-locale LANG = nb_NO.UTF-8
otonglet
7

Pour reconfigurer le fuseau horaire et les paramètres régionaux de manière non interactive, à partir d'un script, voici ce qui fonctionne pour moi (sous Debian):

  • Pour configurer le fuseau horaire, je crée d'abord '/ etc / localtime' en tant que lien logiciel vers le fichier zoneinfo approprié sous le répertoire '/ usr / share / zoneinfo'. Ensuite, j'exécute la commande dpkg-reconfigure , et tout sera mis en place. Ainsi, par exemple, pour créer le fuseau horaire «Europe / Bruxelles»:

    AREA='Europe'
    ZONE='Brussels'
    
    ZONEINFO_FILE='/usr/share/zoneinfo/'"${AREA}"'/'"${ZONE}"
    ln --force --symbolic "${ZONEINFO_FILE}" '/etc/localtime'
    dpkg-reconfigure --frontend=noninteractive tzdata
    

    (Notez que l'AREA est un sous-répertoire sous '/ usr / share / info', et la ZONE est un fichier sous le sous-répertoire AREA).

  • Pour configurer les paramètres régionaux, je lance d'abord un script sed qui créera une nouvelle copie du fichier '/etc/locale.gen', basée sur le contenu du fichier '/ usr / share / i18n / SUPPORTED'. Chaque ligne du fichier d'entrée sera copiée, mais elle sera transformée en commentaire, sauf s'il s'agit d'une entrée de paramètres régionaux UTF-8 pour une langue que je souhaite rendre disponible sur mon système (par exemple, anglais, néerlandais, français, et allemand):

    sed --regexp-extended --expression='
    
       1  {
             i\
    # This file lists locales that you wish to have built. You can find a list\
    # of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add\
    # user defined locales to /usr/local/share/i18n/SUPPORTED. If you change\
    # this file, you need to rerun locale-gen.\
    \
    
    
          }
    
       /^(en|nl|fr|de)(_[[:upper:]]+)?(\.UTF-8)?(@[^[:space:]]+)?[[:space:]]+UTF-8$/!   s/^/# /
    
    ' /usr/share/i18n/SUPPORTED >  /etc/locale.gen
    

    Ensuite, j'ai défini les paramètres régionaux de l'environnement par défaut dans la base de données debconf, par exemple, en anglais britannique :

    debconf-set-selections <<< 'locales locales/default_environment_locale select en_GB.UTF-8'

    Je supprime ensuite le fichier '/ etc / default / locale' existant (juste pour m'assurer que son ancien contenu n'interfère pas avec mes nouveaux paramètres), et exécute la commande dpkg-reconfigure pour générer tous les paramètres régionaux sélectionnés par le script sed , et pour créer un nouveau fichier '/ etc / default / locale' avec juste une entrée pour définir la variable 'LANG' sur mes paramètres régionaux d'environnement par défaut sélectionnés:

    rm --force --verbose /etc/default/locale
    dpkg-reconfigure --frontend=noninteractive locales
    

    Ensuite, en fonction de mes besoins, je souhaiterai peut-être exécuter quelques commandes de mise à jour des paramètres régionaux , pour remplacer, par exemple, les variables qui affectent la mise en forme des valeurs et les définir sur des paramètres régionaux différents (comme l'anglais irlandais ):

    update-locale LC_NUMERIC='en_IE.UTF-8'
    update-locale LC_TIME='en_IE.UTF-8'
    update-locale LC_MONETARY='en_IE.UTF-8'
    update-locale LC_PAPER='en_IE.UTF-8'
    update-locale LC_NAME='en_IE.UTF-8'
    update-locale LC_ADDRESS='en_IE.UTF-8'
    update-locale LC_TELEPHONE='en_IE.UTF-8'
    update-locale LC_MEASUREMENT='en_IE.UTF-8'
    update-locale LC_IDENTIFICATION='en_IE.UTF-8'
    

    (J'aurais pu spécifier tous ces paramètres sur une seule invocation de la commande update-locale , mais apparemment, l'ordre dans lequel les entrées sont écrites dans le fichier '/ etc / default / locale' est imprévisible si je le fais. Je je préfère qu'ils soient toujours dans le même ordre, c'est pourquoi je les génère un par un.)

    Et enfin, je voudrais peut-être exécuter la commande update-locale une dernière fois, pour configurer la variable LANGUAGE (c'est-à-dire la liste des langues dans lesquelles je veux que les messages texte traduisibles soient affichés):

    update-locale LANGUAGE='en_GB:en_US:en'

Jetez tout cela ensemble dans un script bash, et vous pouvez facilement reconfigurer vos paramètres régionaux avec une simple exécution du script, qui ne nécessitera aucune autre interaction de l'utilisateur.

D'après mon expérience, cependant, les nouveaux paramètres ne seront entièrement activés qu'après avoir redémarré votre système deux fois (au moins sur Debian Jessie Xfce). Après le premier redémarrage, le gestionnaire de connexion prendra correctement les nouveaux paramètres, mais après votre connexion, votre session utilisateur continuera à utiliser les anciens paramètres; puis, après le deuxième redémarrage, votre session utilisateur prendra également les nouveaux paramètres.

luvr
la source
7

Basé sur l'excellent travail dans la réponse de @ EirikW. Spécifique à un Dockerfile:

ENV LANG=en_GB.UTF-8
RUN apt-get install -y locales && \
    sed -i -e "s/# $LANG.*/$LANG.UTF-8 UTF-8/" /etc/locale.gen && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=$LANG
mafrosis
la source
1
Je préfère définir l'ENV après, sinon vous obtiendrez cette erreur: "perl: avertissement: la configuration des paramètres régionaux a échoué. \ Perl: avertissement: veuillez vérifier que vos paramètres régionaux: \ LANG =" en_US.UTF-8 "\ sont pris en charge et installé sur votre système. \ perl: avertissement: retour aux paramètres régionaux standard ("C").
otonglet
6

Pour moi, il fallait régler les 3 ENV-Vars supplémentaires:

# - Set the locale + timezone --------------------------------------------------
RUN echo "Europe/Vienna" > /etc/timezone && \
    dpkg-reconfigure -f noninteractive tzdata && \
    sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    sed -i -e 's/# de_AT.UTF-8 UTF-8/de_AT.UTF-8 UTF-8/' /etc/locale.gen && \
    echo 'LANG="de_AT.UTF-8"'>/etc/default/locale && \
    dpkg-reconfigure --frontend=noninteractive locales && \
    update-locale LANG=de_AT.UTF-8

ENV LANG de_AT.UTF-8
ENV LANGUAGE de_AT.UTF-8
ENV LC_ALL de_AT.UTF-8

Cependant, merci à ErikWs pour sa réponse: ( https://serverfault.com/a/689947 )

Mike Mitterer
la source
1
C'est la seule solution qui a fonctionné pour moi, je suis sur la version 17.06.1-ce de Docker, build 874a737
linuxatico