Як встановити локальну систему неінтерактивно на Debian / Ubuntu?


33

Зазвичай я запускаю aptitude -y install localesпотім, dpkg-reconfigure localesщоб налаштувати локаль.

Тепер я хочу вкласти його в сценарій оболонки, як я можу надійно робити наступне, автоматично / неінтерактивно?

  • Виберіть en_US.UTF-8і встановіть його як системний за замовчуванням
  • Вимкнути всі інші локалі
  • (Необов’язково) Перевірте, чи /etc/default/localeмістить один-єдиний запис, LANG=en_US.UTF-8як очікувалося

Відповіді:


13

Перегляньте місцевий рід :

 locale-gen --purge en_US.UTF-8

і

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

1
Дякую, але я отримую 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

Спробуйте LANG = en_US.UTF-8 locale-gen --purge en_US.UTF-8
камінь

Сьогодні вранці з чистим станом ВМ спрацювало! Спасибі!
kenn

Хм… коли ви працюєте locale-gen --purge en_GB.UTF-8на чистій установці, ви отримуєте цей несподіваний вихід: Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.Будь-які ідеї, як встановити список локалів, як це робиться у dpkg-переконфігурувати локалі неінтерактивно?
Бенджамін Нолан

Ці обидва дають дозвіл відмовили у помилках ....
Керін

47

Не вдалося отримати відповідь вище для роботи. Натомість я використовую цей метод (для 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 - це саме те, що мені було потрібно для цього. Спасибі.
peedee

5
Будь ласка, не посилайтеся на інші відповіді як "вище", "внизу" чи подібні. Відповіді рухаються, коли люди голосують за них, приймають їх, видаляють або просто вибирають різні доручення. Завжди використовуйте ім’я особи, яка опублікувала відповідь, а ще краще, використовуйте посилання для спільного доступу у відповіді, яку ви коментуєте, щоб явно посилатися на відповідь.
rjmunro

Трохи охайніша версія цієї відповіді - спеціально для Dockerfiles .. EDIT: оскільки нові рядки тут не працюють, зверніться до моєї сервера
mafrosis

Мені потрібно було en_GB.UTF-8налаштувати локаль у CircleCI - це найкраща відповідь, яка працювала. Сподіваючись, що через цей коментар Google може показати це як релевантне, коли люди намагаються шукати проблему, яка у мене була.
Алекс Сабо

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale є надмірним у локалі оновлення LANG = nb_NO.UTF-8
otonglet

7

Щоб перенастроїти часовий пояс і локали неінтерактивно, зсередини сценарію, ось що працює для мене (під Debian):

  • Для налаштування часового поясу я спочатку створюю "/ etc / localtime" у вигляді м'якого посилання на відповідний файл зон в каталозі "/ usr / share / zoneinfo". Потім я запускаю команду dpkg-configure , і все стане на свої місця. Так, наприклад, створити часовий пояс "Європа / Брюссель":

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

    (Зверніть увагу, що AREA - це підкаталог під "/ usr / share / info", а ZONE - це файл у підкаталозі AREA).

  • Для налаштування локалів я спершу запускаю скрипт sed, який створить нову копію файлу '/etc/locale.gen' на основі вмісту файлу '/ usr / share / i18n / SUPPORTED'. Кожен рядок із вхідного файлу буде скопійовано, але він перетвориться на коментар, якщо це не запис локалі UTF-8 для мови, яку я хочу зробити доступною у своїй системі (наприклад, англійська, голландська, французька, та німецька):

    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

    Далі я встановлюю локальну середовище за замовчуванням у базі даних debconf, наприклад, на англійську англійську :

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

    Згодом я видаляю існуючий файл '/ etc / default / locale' (просто для того, щоб переконатися, що його старий вміст не заважатиме моїм новим налаштуванням), і запускаю команду dpkg-configіfure, щоб генерувати всі локалі, вибрані скриптом sed , а також створити новий файл / / etc / default / locale з лише записом, щоб встановити змінну 'LANG' на вибрану мовою середовища за замовчуванням:

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

    Тоді, залежно від моїх вимог, я, можливо, захочу виконати кілька команд оновлення для локалізації , щоб змінити, наприклад, змінні, що впливають на форматування значень, і встановити їх на іншу локаль (наприклад, ірландська англійська мова ):

    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'

    (Я міг би вказати всі ці параметри в одному виклику команди update-locale , але, мабуть, порядок, коли записи записуються у файл '/ etc / default / locale', є непередбачуваним, якщо я це роблю. I віддайте перевагу, щоб вони завжди були в одному порядку, саме тому я генерую їх по черзі.)

    І нарешті, я, можливо, захочу виконати команду update-locale в останній раз, щоб встановити змінну LANGUAGE (тобто список мов, на які я хочу відобразити текстові повідомлення, що перекладаються):

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

Скиньте все це разом у bash-скрипт, і ви зможете легко налаштувати параметри локалі за допомогою простого запуску сценарію, що не потребуватиме подальшої взаємодії з користувачем.

На мій досвід, однак, нові налаштування не стануть повністю активованими, поки ви не перезавантажите систему двічі (принаймні, на Debian Jessie Xfce). Після першої перезавантаження менеджер входу прийме нові налаштування в порядку, але після входу в систему, ваша сесія користувача продовжить використовувати старі налаштування; після другого перезавантаження ваше сеанс користувача також прийме нові налаштування.


7

На основі чудової роботи у відповіді @ EirikW. Характерно для 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
Я вважаю за краще встановити ENV після того, як інакше ви отримаєте цю помилку: "perl: попередження: Не вдалося встановити локаль. \ Perl: попередження: Перевірте, чи підтримуються ваші параметри локалі: \ LANG =" en_US.UTF-8 "\ і встановлено у вашій системі. \ perl: попередження: Повернення до стандартної мови ("C").
otonglet

6

Для мене потрібно було встановити додаткові 3 ENV-Vars:

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

Однак спасибі ErikWs за ​​його відповідь: ( https://serverfault.com/a/689947 )


1
Це єдине рішення, яке працювало для мене, я перебуваю на версії Docker 17.06.1-ce, build 874a737
linuxatico
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.