it-swarm.com.de

Wie legt man ein Gebietsschema nicht interaktiv unter Debian / Ubuntu fest?

Normalerweise starte ich aptitude -y install locales dann dpkg-reconfigure locales um das Gebietsschema einzurichten.

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

  • Wählen en_US.UTF-8 und als Systemstandard festlegen
  • Deaktivieren Sie alle anderen Gebietsschemas
  • (Optional) Überprüfen Sie, ob /etc/default/locale enthält den einzigen Eintrag von LANG=en_US.UTF-8 wie erwartet
34
kenn

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
14
Stone

Die obige Antwort konnte nicht funktionieren. Stattdessen verwende ich diese Methode (für Docker-Dateien):

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

Basierend auf der guten Arbeit in der Antwort von @ EirikW. Spezifisch 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
7
mafrosis

Um die Zeitzone und die Gebietsschemas nicht interaktiv innerhalb eines Skripts neu zu konfigurieren, funktioniert Folgendes für mich (unter Debian):

  • Zum Konfigurieren der Zeitzone erstelle ich zuerst '/ etc/localtime' als Softlink zur entsprechenden zoneinfo -Datei im Verzeichnis '/ usr/share/zoneinfo'. Dann führe ich den Befehl dpkg-refreshfigure aus, und alles wird eingerichtet. So richten Sie beispielsweise die Zeitzone „Europa/Brüssel“ ein:

    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 das AREA ein Unterverzeichnis unter '/ usr/share/info' und die ZONE eine Datei unter dem AREA-Unterverzeichnis ist.).

  • Zum Konfigurieren der Gebietsschemas führe ich zuerst ein sed -Skript aus, das eine neue Kopie der Datei '/etc/locale.gen' basierend auf dem Inhalt von '/ usr/share/i18n/erstellt. SUPPORTED 'Datei. 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 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-refreshfigure aus, um alle zu generieren die Gebietsschemas, die das Skript sed ausgewählt hat, und zum Erstellen einer neuen Datei '/ etc/default/locale' mit nur einem Eintrag zum Festlegen der Variablen 'LANG' auf das ausgewählte Gebietsschema der Standardumgebung:

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

    Abhängig von meinen Anforderungen möchte ich dann möglicherweise einige pdate-locale -Befehle ausführen, um beispielsweise die Variablen, die sich auf die Formatierung von Werten auswirken, zu überschreiben und sie auf ein anderes Gebietsschema festzulegen (z 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 pdate-locale angeben können, aber anscheinend ist die Reihenfolge, in der die Einträge in die Datei '/ etc/default/locale' geschrieben werden unvorhersehbar, wenn ich das tue. Ich bevorzuge, dass sie immer in der gleichen Reihenfolge sind, weshalb ich sie einzeln generiere.)

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

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

Wenn Sie all dies in einem Bash-Skript zusammenfassen, können Sie Ihre Gebietsschemaeinstellungen einfach mit einer einfachen Ausführung des Skripts neu konfigurieren, ohne dass weitere Benutzerinteraktionen erforderlich sind.

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 nimmt der Anmeldemanager die neuen Einstellungen in Ordnung, aber nach der Anmeldung verwendet Ihre Benutzersitzung weiterhin die alten Einstellungen. Nach dem zweiten Neustart übernimmt Ihre Benutzersitzung auch die neuen Einstellungen.

7
luvr

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 )

6
Mike Mitterer