web-dev-qa-db-ja.com

Debian / Ubuntuで非対話的にロケールを設定するにはどうしますか?

通常、aptitude -y install localesを実行してからdpkg-reconfigure localesを実行してロケールを設定します。

今、それをシェルスクリプトに入れたいのですが、どのようにして自動的に/非対話的に以下を確実に実行できますか?

  • en_US.UTF-8を選択し、システムのデフォルトとして設定します
  • 他のすべてのロケールを無効にする
  • (オプション)/etc/default/localeLANG=en_US.UTF-8の唯一のエントリが含まれていることを確認します
34
kenn

locale-genを参照してください:

 locale-gen --purge en_US.UTF-8

そして

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

上記の答えが機能しませんでした。代わりに、この方法を使用します(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
49
EirikW

@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
7
mafrosis

スクリプト内から非対話的にタイムゾーンとロケールを再構成するために、以下は(Debianの下で)私にとって機能するものです:

  • タイムゾーンを設定するには、まず「/ etc/localtime」を「/ usr/share/zoneinfo」ディレクトリの下の適切なzoneinfoファイルへのソフトリンクとして作成します。次に、dpkg-reconfigureコマンドを実行すると、すべてが配置されます。たとえば、タイムゾーン「ヨーロッパ/ブリュッセル」を設定するには、次のようにします。

    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スクリプトを実行します。このスクリプトは、 '/ usr/share/i18n /の内容に基づいて、'/etc/locale.gen 'ファイルの新しいコピーを作成します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-reconfigureコマンドを実行してすべてを生成しますsedスクリプトが選択したロケール、および 'LANG'変数を選択したデフォルトの環境ロケールに設定するためのエントリのみを含む新しい '/ etc/default/locale'ファイルを作成するには:

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

    次に、私の要件に応じて、いくつかのpdate-localeコマンドを実行して、たとえば、値のフォーマットに影響を与える変数をオーバーライドし、それらを別のロケール(たとえば、 アイルランド英語):

    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'
    

    pdate-localeコマンドの1回の呼び出しでこれらのパラメーターをすべて指定することもできましたが、エントリが '/ etc/default/locale'ファイルに書き込まれる順序はそうする場合、予測できません。常に同じ順序にすることをお勧めします。そのため、1つずつ生成します。)

    最後に、最後にpdate-localeコマンドを実行して、LANGUAGE変数(つまり、翻訳可能なテキストメッセージを表示する言語のリスト)を設定します。

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

これらすべてをまとめてbashスクリプトに入れれば、スクリプトを実行するだけで簡単にロケール設定を再構成できます。これにより、ユーザーがさらに操作する必要はありません。

ただし、私の経験では、システムを2回再起動するまで(少なくともDebian Jessie Xfceでは)、新しい設定が完全​​にアクティブになることはありません。最初の再起動後、ログインマネージャーは新しい設定を使用しますが、ログイン後、ユーザーセッションは引き続き古い設定を使用します。次に、2回目の再起動後、ユーザーセッションにも新しい設定が適用されます。

7
luvr

私にとっては、追加の3つのENV-Varを設定する必要がありました:

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

6
Mike Mitterer