Come si imposta un locale in modo non interattivo su Debian / Ubuntu?


33

Di solito, corro aptitude -y install localesquindi dpkg-reconfigure localesper configurare le impostazioni internazionali.

Ora voglio metterlo in uno script di shell, come posso fare in modo affidabile quanto segue, automaticamente / non interattivamente?

  • Scegli en_US.UTF-8e impostalo come predefinito di sistema
  • Disabilita tutte le altre impostazioni locali
  • (Facoltativo) Verifica se /etc/default/localecontiene una voce unica LANG=en_US.UTF-8come previsto

Risposte:


13

Vedi locale-gen :

 locale-gen --purge en_US.UTF-8

e

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale

1
Grazie, ma sto ottenendo 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"))...
gennaio

Prova LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Stone

Questa mattina, con uno stato pulito di VM, ha funzionato! Grazie!
gennaio

Hmm ... quando si esegue locale-gen --purge en_GB.UTF-8un'installazione pulita, si ottiene questo output imprevisto: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.Qualche idea su come impostare l'elenco delle impostazioni locali come si fa in dpkg-riconfigurare le impostazioni in modo non interattivo?
Benjamin Nolan,

Entrambi danno errori di autorizzazione negati ....
Cerin,

47

Impossibile ottenere la risposta sopra per funzionare. Invece, utilizzo questo metodo (per 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

3
Dockerfile è esattamente ciò di cui avevo bisogno. Grazie.
Peedee,

5
Si prega di non fare riferimento ad altre risposte come "sopra", "sotto" o simili. Le risposte si spostano mentre le persone votano per loro, le accettano, le cancellano o semplicemente scelgono ordini diversi. Usa sempre il nome della persona che ha pubblicato la risposta, o ancora meglio, usa il link condividi sotto la risposta che stai commentando per collegarti esplicitamente alla risposta.
rjmunro,

Versione leggermente più chiara di questa risposta - in particolare per Dockerfiles. MODIFICA: poiché i newline non funzionano qui, si prega di fare riferimento alla mia risposta serverfault.com/a/801162/89669
mafrosis

Avevo bisogno di en_GB.UTF-8configurare le impostazioni locali in CircleCI: questa era la migliore risposta che funzionava. Sperando che a causa di questo commento, Google potrebbe mostrarlo pertinente quando le persone provano a cercare il problema che stavo riscontrando.
Alex Szabó,

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale è ridondante con update-locale LANG = nb_NO.UTF-8
otonglet

7

Per riconfigurare il fuso orario e le localizzazioni in modo non interattivo, all'interno di uno script, ecco cosa funziona per me (sotto Debian):

  • Per configurare il fuso orario, per prima cosa creo '/ etc / localtime' come un soft link al file zoneinfo appropriato nella directory '/ usr / share / zoneinfo'. Quindi, eseguo il comando dpkg-reconfigure e tutto sarà messo in atto. Ad esempio, per impostare il fuso orario "Europa / Bruxelles":

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

    (Notare che AREA è una sottodirectory in "/ usr / share / info" e ZONE è un file nella sottodirectory AREA).

  • Per configurare le impostazioni locali, eseguo prima uno script sed che creerà una nuova copia del file '/etc/locale.gen', in base al contenuto del file '/ usr / share / i18n / SUPPORTED'. Ogni riga del file di input verrà copiata, ma verrà trasformata in un commento a meno che non sia una voce di una locale UTF-8 per una lingua che desidero rendere disponibile sul mio sistema (ad es. Inglese, olandese, francese, e tedesco):

    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

    Successivamente, ho impostato le impostazioni predefinite dell'ambiente nel database debconf, ad esempio, sull'inglese britannico :

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

    Successivamente rimuovo il file '/ etc / default / locale' esistente (solo per assicurarmi che i suoi vecchi contenuti non interferiscano con le mie nuove impostazioni), ed eseguo il comando dpkg-reconfigure per generare tutte le localizzazioni selezionate dallo script sed e per creare un nuovo file '/ etc / default / locale' con solo una voce per impostare la variabile 'LANG' sulla locale del mio ambiente predefinito selezionato:

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

    Quindi, a seconda delle mie esigenze, potrei voler eseguire alcuni comandi di aggiornamento della locale , per sovrascrivere, ad esempio, le variabili che influenzano la formattazione dei valori e impostarli su una locale diversa (come l'inglese irlandese ):

    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'

    (Avrei potuto specificare tutti questi parametri in un'unica chiamata del comando update-locale , ma apparentemente l'ordine in cui le voci vengono scritte nel file '/ etc / default / locale' è imprevedibile se lo faccio. preferisco che siano sempre nello stesso ordine, motivo per cui li ho generati uno per uno.)

    E infine, potrei voler eseguire il comando update-locale un'ultima volta, per impostare la variabile LANGUAGE (ovvero l'elenco delle lingue in cui voglio che vengano visualizzati i messaggi di testo traducibili):

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

Metti tutto questo insieme in uno script bash e puoi facilmente riconfigurare le impostazioni locali con una semplice esecuzione dello script, che non richiederà ulteriori interazioni dell'utente.

Nella mia esperienza, tuttavia, le nuove impostazioni non saranno completamente attivate fino a dopo il riavvio del sistema due volte (almeno su Debian Jessie Xfce). Dopo il primo riavvio, il gestore degli accessi prenderà bene le nuove impostazioni, ma dopo aver effettuato l'accesso, la sessione utente continuerà a utilizzare le vecchie impostazioni; quindi, dopo il secondo riavvio, anche la sessione utente prenderà le nuove impostazioni.


7

Basato sull'ottimo lavoro nella risposta di @ EirikW. Specifico per 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

1
Preferisco impostare ENV dopo che altrimenti visualizzerai questo errore: "perl: avviso: impostazione della locale non riuscita. \ Perl: avviso: controlla che le impostazioni della tua locale: \ LANG =" en_US.UTF-8 "\ siano supportate e installato sul sistema. \ perl: avviso: ripristino delle impostazioni internazionali standard ("C").
otonglet

6

Per me è stato necessario impostare i 3 ENV-Vars aggiuntivi:

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

Tuttavia, grazie a ErikWs per la sua risposta: ( https://serverfault.com/a/689947 )


1
Questa è l'unica soluzione che ha funzionato per me, sono su Docker versione 17.06.1-ce, build 874a737
linuxatico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.