ken*_*enn 40 ubuntu debian localization shell-scripting
通常,我运行aptitude -y install locales
然后dpkg-reconfigure locales
设置语言环境。
现在我想把它放到一个 shell 脚本中,我怎样才能可靠地自动/非交互地执行以下操作?
en_US.UTF-8
并将其设置为系统默认值/etc/default/locale
包含LANG=en_US.UTF-8
预期的唯一条目小智 57
无法获得@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
Run Code Online (Sandbox Code Playgroud)
Sto*_*one 16
见locale-gen:
locale-gen --purge en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
和
echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale
Run Code Online (Sandbox Code Playgroud)
maf*_*sis 16
基于@EirikW 的回答中的出色工作。具体到Dockerfile
:
ENV LANG=en_GB.UTF-8
RUN apt-get install -y locales && \
sed -i -e "s/# $LANG.*/$LANG UTF-8/" /etc/locale.gen && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=$LANG
Run Code Online (Sandbox Code Playgroud)
小智 8
对我来说,有必要设置额外的 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
Run Code Online (Sandbox Code Playgroud)
不过感谢 ErikWs 的回答:(https://serverfault.com/a/689947)
要从脚本中以非交互方式重新配置时区和语言环境,以下是对我有用的(在 Debian 下):
对于配置的时区,我首先创建“的/ etc /本地时间”作为一个软链接到相应的区信息的“在/ usr / share / 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
Run Code Online (Sandbox Code Playgroud)
(注意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
Run Code Online (Sandbox Code Playgroud)
接下来,我将 debconf 数据库中的默认环境语言环境设置为英式英语:
debconf-set-selections <<< 'locales locales/default_environment_locale select en_GB.UTF-8'
Run Code Online (Sandbox Code Playgroud)
我随后删除了现有的“/etc/default/locale”文件(只是为了确保其旧内容不会干扰我的新设置),并运行dpkg-reconfigure命令以生成sed脚本选择的所有语言环境, 并创建一个新的 '/etc/default/locale' 文件,其中只有一个条目来将 'LANG' 变量设置为我选择的默认环境语言环境:
rm --force --verbose /etc/default/locale
dpkg-reconfigure --frontend=noninteractive locales
Run Code Online (Sandbox Code Playgroud)
然后,根据我的要求,我可能想要运行一些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'
Run Code Online (Sandbox Code Playgroud)
(我可以在一次调用update-locale命令时指定所有这些参数,但显然,如果我这样做,条目写入“/etc/default/locale”文件的顺序是不可预测的。我更喜欢它们总是以相同的顺序排列,这就是我一一生成它们的原因。)
最后,我可能想最后一次运行update-locale命令,以设置 LANGUAGE 变量(即,我希望显示可翻译文本消息的语言列表):
update-locale LANGUAGE='en_GB:en_US:en'
Run Code Online (Sandbox Code Playgroud)将所有这些放在一个 bash 脚本中,您可以通过简单的脚本运行轻松地重新配置您的区域设置,这不需要任何进一步的用户交互。
然而,根据我的经验,直到您重新启动系统两次后(至少在 Debian Jessie Xfce 上),新设置才会完全激活。第一次重启后,登录管理器会采用新的设置,但登录后,您的用户会话将继续使用旧设置;然后,在第二次重新启动后,您的用户会话也将采用新设置。
归档时间: |
|
查看次数: |
36901 次 |
最近记录: |