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を参照してください:

 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
ストーン

今朝、VMのクリーンな状態で、うまくいきました!ありがとう!
kenn

うーん… locale-gen --purge en_GB.UTF-8クリーンインストールで実行すると、この予期しない出力が得Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.られます。dpkg-reconfigurelocalesで非対話的に行うようにロケールのリストを設定する方法はありますか?
ベンジャミンノーラン

これは両方とも、許可されていないエラーを拒否します
。...– Cerin

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はまさに私がこれを必要としていたものです。ありがとう。
ピーディー

5
他の回答を「上」、「下」などと呼ばないでください。回答は、人々が投票したり、受け入れたり、削除したり、あるいは単に別の注文を選んだりすると動き回ります。回答を投稿した人の名前を常に使用するか、さらに良いことに、コメントしている回答の下の共有リンクを使用して、回答に明示的にリンクします。
rjmunro

改行はここで働いていないので、私の回答を参照してください。特にDockerfilesのための... EDIT -少しこの回答のバージョンすっきりserverfault.com/a/801162/89669
mafrosis

en_GB.UTF-8CircleCIでロケールを設定する必要がありました-これが機能する最良の答えでした。このコメントが原因で、Googleが、私が抱えていた問題を検索しようとすると、関連性があると表示されることを期待しています。
アレックスシャボ

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / localeはupdate-localeと冗長ですLANG = nb_NO.UTF-8
otonglet

7

スクリプト内から非対話形式でタイムゾーンとロケールを再構成するには、ここで私のために働くものがあります(Debianの下):

  • タイムゾーンを設定するために、最初に「/ usr / share / zoneinfo」ディレクトリの下の適切なzoneinfoファイルへのソフトリンクとして「/ etc / localtime」を作成します。次に、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 / SUPPORTED'ファイルの内容に基づいて、 '/ etc / locale.gen'ファイルの新しいコピーを作成します。入力ファイルのすべての行がコピーされますが、システムで使用できるようにする言語の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
    

    次に、要件に応じて、いくつかのupdate-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'
    

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

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

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

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

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


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


1
これが私のために働いた唯一のソリューションです、私はDockerバージョン17.06.1-ce、ビルド874a737
linuxatico
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.