Wie kann ein Gebietsschema unter Debian / Ubuntu nicht interaktiv festgelegt werden?

33

Normalerweise laufe ich aptitude -y install localesdann dpkg-reconfigure locales, um das Gebietsschema einzurichten.

Jetzt möchte ich es in ein Shell-Skript einfügen. Wie kann ich Folgendes zuverlässig ausführen, automatisch / nicht interaktiv?

  • Wählen Sie en_US.UTF-8und legen Sie es als Systemstandard fest
  • Deaktivieren Sie alle anderen Gebietsschemas
  • (Optional) Überprüfen Sie, ob /etc/default/localeder LANG=en_US.UTF-8erwartete Eintrag nur einmal vorhanden ist
kenn
quelle

Antworten:

13

Siehe locale-gen :

 locale-gen --purge en_US.UTF-8

und

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Stein
quelle
1
Danke, aber ich bekomme 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
Versuchen Sie es mit LANG = de_DE.UTF-8 locale-gen --purge de_DE.UTF-8
Stone
Heute Morgen hat es bei einem sauberen VM-Zustand funktioniert! Vielen Dank!
kenn
Hmm ... wenn Sie locale-gen --purge en_GB.UTF-8eine Neuinstallation ausführen , erhalten Sie diese unerwartete Ausgabe: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.Gibt es Ideen, wie Sie die Liste der Gebietsschemas so einstellen können, wie Sie es in dpkg-reconfigure locales nicht interaktiv tun?
Benjamin Nolan
Dies geben beide Erlaubnis verweigert Fehler ....
Cerin
47

Konnte die obige Antwort nicht zum Laufen bringen. Stattdessen verwende ich diese Methode (für 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
quelle
3
Dockerfile ist genau das, wofür ich es brauchte. Vielen Dank.
Peedee
5
Bitte bezeichnen Sie andere Antworten nicht als "oben", "unten" oder ähnlich. Die Antworten bewegen sich, wenn Leute für sie stimmen, sie akzeptieren, sie löschen oder einfach andere Aufträge auswählen. Verwenden Sie immer den Namen der Person, die die Antwort gepostet hat, oder, noch besser, den Freigabe-Link unter der Antwort, die Sie kommentieren, um explizit auf die Antwort zu verweisen.
rjmunro
Etwas übersichtlichere Version dieser Antwort - speziell für Dockerfiles. BEARBEITEN: Da Zeilenumbrüche hier nicht funktionieren, lesen Sie bitte meine Antwort serverfault.com/a/801162/89669
mafrosis
Ich musste das en_GB.UTF-8Gebietsschema in CircleCI einrichten - das war die beste Antwort, die funktioniert hat. In der Hoffnung, dass Google dies aufgrund dieses Kommentars als relevant anzeigt, wenn Leute versuchen, nach dem Problem zu suchen, das ich hatte.
Alex Szabó
echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale ist redundant mit update-locale LANG = nb_NO.UTF-8
otonglet
7

Um die Zeitzone und das Gebietsschema nicht interaktiv aus einem Skript heraus neu zu konfigurieren, funktioniert für mich Folgendes (unter Debian):

  • Zum Konfigurieren der Zeitzone erstelle ich '/ etc / localtime' als Softlink zur entsprechenden zoneinfo- Datei im Verzeichnis '/ usr / share / zoneinfo'. Dann führe ich den Befehl dpkg-reconfigure aus und alles wird eingerichtet. Um beispielsweise die Zeitzone "Europa / Brüssel" einzurichten:

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

    (Beachten Sie, dass die AREA ein Unterverzeichnis unter '/ usr / share / info' und die ZONE eine Datei unter dem AREA-Unterverzeichnis ist.)

  • Zum Konfigurieren der Ländereinstellungen führe ich zuerst ein sed- Skript aus, mit dem eine neue Kopie der Datei '/etc/locale.gen' erstellt wird, die auf dem Inhalt der Datei '/ usr / share / i18n / SUPPORTED' basiert. Jede Zeile aus der Eingabedatei wird kopiert, aber in einen Kommentar umgewandelt, es sei denn, es handelt sich um einen Eintrag eines UTF-8-Gebietsschemas für eine Sprache, die ich auf meinem System verfügbar machen möchte (z. B. Englisch, Niederländisch, Französisch, und Deutsch):

    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

    Als Nächstes setze ich das Standardumgebungsgebietsschema in der Debconf-Datenbank, z. B. auf Britisches Englisch :

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

    Anschließend entferne ich die vorhandene Datei '/ etc / default / locale' (nur um sicherzustellen, dass der alte Inhalt meine neuen Einstellungen nicht beeinträchtigt) und führe den Befehl dpkg-reconfigure aus , um alle Ländereinstellungen zu generieren, die das sed- Skript ausgewählt hat , und um eine neue '/ etc / default / locale'-Datei mit nur einem Eintrag zu erstellen, um die' LANG'-Variable auf mein ausgewähltes Standardumgebungsgebietsschema zu setzen:

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

    Abhängig von meinen Anforderungen möchte ich möglicherweise einige Befehle zum Aktualisieren des Gebietsschemas ausführen, um z. B. die Variablen zu überschreiben, die sich auf die Formatierung von Werten auswirken, und sie auf ein anderes Gebietsschema festzulegen (z. B. irisches Englisch ):

    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'

    (Ich hätte alle diese Parameter bei einem einzigen Aufruf des Befehls update-locale angeben können , aber anscheinend ist die Reihenfolge, in der die Einträge in die Datei '/ etc / default / locale' geschrieben werden, nicht vorhersehbar, wenn ich dies tue bevorzuge, dass sie immer in der gleichen Reihenfolge sind, weshalb ich sie einzeln generiere.)

    Und schließlich möchte ich möglicherweise den Befehl update-locale ein letztes Mal ausführen , um die Variable LANGUAGE (dh die Liste der Sprachen, in denen übersetzbare Textnachrichten angezeigt werden sollen) einzurichten:

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

Wenn Sie all dies in einem Bash-Skript zusammenfassen, können Sie Ihre Gebietsschemaeinstellungen mit einem einfachen Skriptlauf neu konfigurieren, der keine weitere Benutzerinteraktion erfordert.

Nach meiner Erfahrung werden die neuen Einstellungen jedoch erst vollständig aktiviert, nachdem Sie Ihr System zweimal neu gestartet haben (zumindest unter Debian Jessie Xfce). Nach dem ersten Neustart übernimmt der Anmeldungsmanager die neuen Einstellungen in Ordnung. Nach der Anmeldung verwendet Ihre Benutzersitzung jedoch weiterhin die alten Einstellungen. Nach dem zweiten Neustart übernimmt Ihre Benutzersitzung auch die neuen Einstellungen.

luvr
quelle
7

Basierend auf der guten Arbeit in der Antwort von @ EirikW. Speziell für ein 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
quelle
1
Ich ziehe es vor, die ENV zu setzen, wenn sonst folgende Fehlermeldung angezeigt wird: "perl: warning: Das Setzen des Gebietsschemas ist fehlgeschlagen. \ Perl: warning: Bitte überprüfen Sie, ob Ihre Gebietsschemaeinstellungen: \ LANG =" en_US.UTF-8 "\ unterstützt werden auf Ihrem System installiert. \ perl: Warnung:
Zurückgreifen
6

Für mich war es notwendig, die zusätzlichen 3 ENV-Vars einzustellen:

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

Vielen Dank jedoch an ErikWs für seine Antwort: ( https://serverfault.com/a/689947 )

Mike Mitterer
quelle
1
Dies ist die einzige Lösung, die für mich funktioniert hat. Ich bin auf Docker, Version 17.06.1-ce, Build 874a737
Linuxatico,