데비안 / 우분투에서 로케일을 비 대화식으로 어떻게 설정합니까?


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
Stone

오늘 아침 VM의 상태가 깨끗했습니다. 감사!
kenn

흠… locale-gen --purge en_GB.UTF-8새로 설치 를 실행 하면 예기치 않은 결과가 나타납니다. Generating locales (this might take a while)... en_US.UTF-8... done Generation complete.dpkg-reconfigure locales에서 비 대화식으로 로케일 목록을 설정하는 방법에 대한 아이디어가 있습니까?
Benjamin Nolan

이것은 둘 다 권한 거부 오류를 제공합니다 ....
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에 대한 ... 편집 : 줄 바꿈 여기서 일하지 않기 때문에, 내 대답을 참조하십시오 serverfault.com/a/801162/89669
mafrosis

나는 한 데 필요한 en_GB.UTF-8로케일 CircleCI에서 설정 -이 작업 한 가장 좋은 대답했다. 이 의견으로 인해 Google은 사람들이 내가 겪고있는 문제를 검색하려고 할 때 관련성이 있다고 표시 할 수 있습니다.
Alex Szabó

echo 'LANG = "nb_NO.UTF-8"'> / etc / default / locale은 update-locale으로 중복됩니다. LANG = nb_NO.UTF-8
otonglet

7

스크립트 내에서 시간대와 로케일을 비 대화식으로 재구성하려면 다음이 데비안에서 작동합니다.

  • 시간대를 구성하기 위해 먼저 '/ 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 하위 디렉토리 아래의 파일입니다.

  • 로케일을 구성하기 위해 먼저 '/ usr / share / i18n / SUPPORTED'파일의 내용을 기반으로 '/etc/locale.gen'파일의 새 사본을 작성 하는 sed 스크립트를 실행 합니다. 입력 파일의 모든 행이 복사되지만 시스템에서 사용할 언어 (예 : 영어, 네덜란드어, 프랑스어, 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 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'파일에 기록되는 순서는 예측할 수없는 것으로 보입니다. 항상 같은 순서를 유지하는 것을 선호하므로 하나씩 생성합니다.)

    마지막으로 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
"perl : warning : 로케일 설정에 실패했습니다. \ perl : 경고 : 로케일 설정을 확인하십시오 : \ LANG ="en_US.UTF-8 "\ \ perl : 경고 : 표준 로케일로
폴백

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에서 빌드 874a737
linuxatico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.