¿Cómo se configura un entorno local de forma no interactiva en Debian / Ubuntu?

33

Por lo general, corro aptitude -y install localesa continuación dpkg-reconfigure localespara establecer la configuración regional.

Ahora quiero ponerlo en un script de shell, ¿cómo puedo hacer de manera confiable lo siguiente, de forma automática / no interactiva?

  • Elija en_US.UTF-8y configúrelo como predeterminado del sistema
  • Deshabilitar todas las demás configuraciones regionales
  • (Opcional) Verifique si /etc/default/localecontiene una entrada única de LANG=en_US.UTF-8lo esperado
Kenn
fuente

Respuestas:

13

Ver locale-gen :

 locale-gen --purge en_US.UTF-8

y

 echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Piedra
fuente
1
Gracias, pero me estoy haciendo 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
Pruebe LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
Stone
Esta mañana, con un estado limpio de VM, ¡funcionó! ¡Gracias!
kenn
Hmm ... cuando ejecuta locale-gen --purge en_GB.UTF-8una instalación limpia, obtiene este resultado inesperado: ¿ Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.Alguna idea de cómo configurar la lista de configuraciones regionales como lo hace en dpkg-reconfigure configuraciones regionales de forma no interactiva?
Benjamin Nolan
Ambos dan permiso denegado errores ...
Cerin
47

No se pudo obtener la respuesta anterior para trabajar. En cambio, uso este método (para 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
fuente
3
Dockerfile es exactamente para lo que necesitaba esto. Gracias.
peedee
55
No se refiera a otras respuestas como "arriba", "abajo" o similar. Las respuestas se mueven a medida que las personas las votan, las aceptan, las eliminan o simplemente eligen diferentes órdenes. Siempre use el nombre de la persona que publicó la respuesta, o incluso mejor, use el enlace para compartir debajo de la respuesta que está comentando para vincular la respuesta explícitamente.
rjmunro
Versión ligeramente más ordenada de esta respuesta, específicamente para Dockerfiles. EDITAR: dado que las nuevas líneas no funcionan aquí, consulte mi respuesta serverfault.com/a/801162/89669
mafrosis el
Necesitaba tener la en_GB.UTF-8configuración regional configurada en CircleCI; esta fue la mejor respuesta que estaba funcionando. Con la esperanza de que debido a este comentario, Google pueda mostrar esto como relevante cuando las personas intentan buscar el problema que estaba teniendo.
Alex Szabó
echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale es redundante con update-locale LANG = nb_NO.UTF-8
otonglet
7

Para reconfigurar la zona horaria y las configuraciones regionales de forma no interactiva, desde un script, esto es lo que funciona para mí (en Debian):

  • Para configurar la zona horaria, primero creo '/ etc / localtime' como un enlace suave al archivo zoneinfo apropiado en el directorio '/ usr / share / zoneinfo'. Luego, ejecuto el comando dpkg-reconfigure , y todo se pondrá en su lugar. Entonces, por ejemplo, para configurar la zona horaria 'Europa / Bruselas':

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

    (Tenga en cuenta que AREA es un subdirectorio bajo '/ usr / share / info', y ZONE es un archivo bajo el subdirectorio AREA).

  • Para configurar las configuraciones regionales, primero ejecuto un script sed que creará una nueva copia del archivo '/etc/locale.gen', basado en el contenido del archivo '/ usr / share / i18n / SUPPORTED'. Todas las líneas del archivo de entrada se copiarán, pero se convertirán en un comentario a menos que sea una entrada de una configuración regional UTF-8 para un idioma que deseo que esté disponible en mi sistema (por ejemplo, inglés, holandés, francés, y alemán):

    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

    A continuación, configuro el entorno local predeterminado en la base de datos de debconf, por ejemplo, en inglés británico :

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

    Posteriormente elimino el archivo '/ etc / default / locale' existente (solo para asegurarme de que su contenido anterior no interferirá con mi nueva configuración), y ejecuto el comando dpkg-reconfigure para generar todas las configuraciones regionales que el script sed seleccionó , y para crear un nuevo archivo '/ etc / default / locale' con solo una entrada para establecer la variable 'LANG' en mi entorno local predeterminado seleccionado:

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

    Luego, según mis requisitos, es posible que desee ejecutar algunos comandos de actualización de configuración regional , para anular, por ejemplo, las variables que afectan el formato de los valores y establecerlas en una configuración regional diferente (como el inglés irlandés ):

    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'

    (Podría haber especificado todos estos parámetros en una sola invocación del comando update-locale , pero aparentemente, el orden en que las entradas se escriben en el archivo '/ etc / default / locale' es impredecible si lo hago. prefiero que siempre estén en el mismo orden, por eso los genero uno por uno.)

    Y finalmente, es posible que desee ejecutar el comando update-locale por última vez, para configurar la variable LANGUAGE (es decir, la lista de idiomas en los que quiero que se muestren los mensajes de texto traducibles):

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

Agregue todo esto a un script bash, y puede reconfigurar fácilmente su configuración regional con una simple ejecución del script, que no requerirá ninguna interacción adicional del usuario.

En mi experiencia, sin embargo, la nueva configuración no se activará por completo hasta después de reiniciar el sistema dos veces (al menos en Debian Jessie Xfce). Después del primer reinicio, el administrador de inicio de sesión tomará la nueva configuración correctamente, pero después de iniciar sesión, su sesión de usuario continuará utilizando la configuración anterior; luego, después del segundo reinicio, su sesión de usuario también tomará la nueva configuración.

luvr
fuente
7

Basado en el buen trabajo en la respuesta de @ EirikW. Específico para 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
fuente
1
Prefiero configurar el ENV después de lo contrario, obtendrá este error: "perl: advertencia: configuración regional fallida. \ Perl: advertencia: compruebe que su configuración regional: \ LANG =" en_US.UTF-8 "\ sea compatible y instalado en su sistema. \ perl: advertencia: volviendo a la configuración regional estándar ("C").
otonglet
6

Para mí fue necesario configurar los 3 ENV-Vars adicionales:

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

Sin embargo, gracias a ErikWs por su respuesta: ( https://serverfault.com/a/689947 )

Mike Mitterer
fuente
1
Esta es la única solución que funcionó para mí, estoy en Docker versión 17.06.1-ce, compilación 874a737
linuxatico