Frage Wie setzt man ein Gebietsschema nicht interaktiv auf Debian / Ubuntu?


Normalerweise renne ich aptitude -y install locales dann dpkg-reconfigure locales Gebietsschema einrichten.

Jetzt möchte ich es in ein Shell-Skript einfügen, wie kann ich folgendes automatisch / nicht-interaktiv zuverlässig erledigen?

  • Wählen en_US.UTF-8 und legen Sie es als Systemstandard fest
  • Deaktivieren Sie alle anderen Ländereinstellungen
  • (Optional) Überprüfen Sie, ob /etc/default/locale enthält den einmaligen Eintrag von LANG=en_US.UTF-8 wie erwartet

21
2018-02-23 06:31


Ursprung




Antworten:


Sehen 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

9
2018-02-23 07:16



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
Probieren Sie LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8 aus - Stone
Heute Morgen, mit einem sauberen Zustand der VM, hat es funktioniert! Vielen Dank! - kenn
Hmm ... wenn du rennst locale-gen --purge en_GB.UTF-8 Bei einer Neuinstallation erhalten Sie diese unerwartete Ausgabe: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete. Irgendwelche Ideen, wie Sie die Liste der Gebietsschemata wie in dpkg-reconfigure locales nicht interaktiv festlegen können? - Benjamin Nolan
Dies gibt beide Fehler verweigert verweigert .... - Cerin


Die obige Antwort konnte nicht funktionieren. 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

32
2018-05-06 09:34



Dockerfile ist genau das, wofür ich das gebraucht habe. Vielen Dank. - peedee
Bitte beziehen Sie sich nicht auf andere Antworten als "oben", "unten" oder ähnlich. Antworten bewegen sich herum, wenn Leute für sie stimmen, sie akzeptieren, löschen oder einfach andere Befehle auswählen. Verwenden Sie immer den Namen der Person, die die Antwort gepostet hat, oder noch besser, verwenden Sie den Freigabe-Link unter der Antwort, die Sie kommentieren, um explizit auf die Antwort zu verweisen. - rjmunro
Etwas bessere Version dieser Antwort - speziell für Dockerfiles .. EDIT: da Zeilenumbrüche hier nicht funktionieren, beziehen Sie sich bitte auf meine Antwort serverfault.com/a/801162/89669 - mafrosis
Ich musste es haben en_GB.UTF-8 Gebietsschema in CircleCI eingerichtet - das war die beste Antwort, die funktionierte. In der Hoffnung, dass Google aufgrund dieses Kommentars dies als relevant ansieht, wenn Leute versuchen, nach dem Problem zu suchen, das ich hatte. - Alex Szabó


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

  • Zur Konfiguration der Zeitzone erstelle ich zuerst '/ etc / localtime' als Softlink zum entsprechenden Zoneninfo Datei im Verzeichnis '/ usr / share / zoneinfo'. Dann renne ich die dpkg-reconfigure Befehl, und alles wird an Ort und Stelle sein. 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' ist und die ZONE eine Datei im Unterverzeichnis AREA ist).

  • Zum Konfigurieren der Ländereinstellungen führe ich zuerst a sed Skript, das eine neue Kopie der Datei '/etc/locale.gen' erstellt, basierend auf dem Inhalt der Datei '/ usr / share / i18n / SUPPORTED'. Jede Zeile aus der Eingabedatei wird kopiert, aber sie wird 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 bereitstellen 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 Standardgebietsschema für die Umgebung in der Debconf-Datenbank, z Britisches Englisch:

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

    Ich entferne anschließend die vorhandene '/ etc / default / locale' Datei (nur um sicherzustellen, dass der alte Inhalt meine neuen Einstellungen nicht beeinträchtigt) und führe die dpkg-reconfigure Befehl, um alle Gebietsschemas zu generieren, die der sed Skript ausgewählt, und um eine neue '/ etc / default / locale'-Datei mit nur einem Eintrag zu erstellen, um die' LANG'-Variable auf das ausgewählte Standard-Umgebungsgebietsschema zu setzen:

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

    Dann, abhängig von meinen Anforderungen, möchte ich vielleicht ein paar laufen lassen Update-Gebietsschema B. die Variablen, die die Formatierung von Werten beeinflussen, zu überschreiben und sie auf ein anderes Gebietsschema (wie 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 Update-Gebietsschema Befehl, aber anscheinend ist die Reihenfolge, in der die Einträge in die Datei '/ etc / default / locale' geschrieben werden, unvorhersehbar, wenn ich dies tue. Ich bevorzuge es, dass sie immer in der gleichen Reihenfolge sind, weshalb ich sie einzeln erzeuge.)

    Und schließlich möchte ich vielleicht die Update-Gebietsschema Befehl ein letztes Mal, um die LANGUAGE-Variable einzurichten (d. h. die Liste der Sprachen, in denen übersetzbare Textnachrichten angezeigt werden sollen):

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

Werfen Sie all dies zusammen in ein Bash-Skript, und Sie können Ihre Gebietsschema-Einstellungen einfach mit einer einfachen Skriptausführung neu konfigurieren, die keine weitere Benutzerinteraktion erfordert.

Meiner Erfahrung nach werden die neuen Einstellungen jedoch erst nach einem Neustart des Systems (zumindest bei Debian Jessie Xfce) vollständig aktiviert. Nach dem ersten Neustart wird der Anmeldemanager die neuen Einstellungen übernehmen, aber nachdem Sie sich angemeldet haben, verwendet Ihre Benutzersitzung weiterhin die alten Einstellungen. Nach dem zweiten Neustart nimmt Ihre Benutzersitzung die neuen Einstellungen ebenfalls an.


6
2017-10-21 13:47





Basierend auf der guten Arbeit in @ EirikWs Antwort. Spezifisch für a 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

4
2017-09-05 15:39





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 an ErikWs für seine Antwort: (https://serverfault.com/a/689947)


2
2018-01-12 14:10



Dies ist die einzige Lösung, die für mich funktioniert, ich bin auf Docker-Version 17.06.1-CE, Build 874a737 - linuxatico