如何删除系统区域设置,而不是包裹询问的语言环境如何删除不需要的区域设置??
我收到以下错误最近:
locale: Cannot set LC_ALL to default locale: No such file or directory
这仅有的 en
我的系统中的语言环境:
$ grep -r en /var/lib/locales/supported.d/*
/var/lib/locales/supported.d/local: en_US ISO-8859-1
/var/lib/locales/supported.d/local: en_US.UTF-8 UTF-8
$ locale -a | grep en
en_US
en_US.iso88591
en_US.utf8
但事实并非如此en
,正如以下人士所抱怨的那样perl
:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "",
LC_ALL = (unset),
LC_MEASUREMENT = "en",
LC_PAPER = "en",
LC_MONETARY = "en",
LC_NAME = "en",
LC_ADDRESS = "en",
LC_NUMERIC = "en",
LC_TELEPHONE = "en",
LC_IDENTIFICATION = "en",
LC_TIME = "en",
LANG = "C"
所以我添加语言环境 en
经过:
% locale-gen en
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8...^C
我不需要上述任何语言环境(仅en_US
),但现在我无法摆脱它们——我按照
https://serverfault.com/questions/394610/remove-a-locale-in-ubuntu
但到了最后一步,我仍然得到:
% locale-gen
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8...^C
如何删除上述所有区域设置并仅保留en_US
?
结论与补充
感谢 Gunnar 的回答,这确实是由 中的条目引起的/etc/locale.gen
,针对那些额外的语言环境。仅供参考,这是locale-gen en
中发生的变化/etc/locale.gen
:
$ sed '/^#/d; /en/p;' /etc/locale.gen
en_AG UTF-8
en_AG UTF-8
en_AU.UTF-8 UTF-8
en_AU.UTF-8 UTF-8
en_BW.UTF-8 UTF-8
en_BW.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
en_DK.UTF-8 UTF-8
en_DK.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_HK.UTF-8 UTF-8
en_HK.UTF-8 UTF-8
en_IE.UTF-8 UTF-8
en_IE.UTF-8 UTF-8
en_IL UTF-8
en_IL UTF-8
en_IN UTF-8
en_IN UTF-8
en_NG UTF-8
en_NG UTF-8
en_NZ.UTF-8 UTF-8
en_NZ.UTF-8 UTF-8
en_PH.UTF-8 UTF-8
en_PH.UTF-8 UTF-8
en_SC.UTF-8 UTF-8
en_SC.UTF-8 UTF-8
en_SG.UTF-8 UTF-8
en_SG.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_ZA.UTF-8 UTF-8
en_ZA.UTF-8 UTF-8
en_ZM UTF-8
en_ZM UTF-8
en_ZW.UTF-8 UTF-8
en_ZW.UTF-8 UTF-8
作为比较,默认设置如下(即没有任何上述额外的语言环境):
$ sed '/^#/d;' /etc/locale.gen; echo ---
---
答案1
笔记:下面的一些命令需要root权限,请考虑使用sudo
。
基本信息
根据man locale-gen
,语言环境在几个文件中设置。
/etc/locale.gen
主配置文件具有简单的格式:每一行非空且不以 # 开头的行都被视为要构建的区域设置定义。
/var/lib/locales/supported.d/
包含语言包提供的 locale.gen 片段的目录。请勿手动编辑这些片段,它们将在包升级时被覆盖。
语言环境被编译(生成)成一个文件。
/usr/lib/locale/locale-archive
通常的默认语言环境存档位置。
有关地点的全面详细信息建筑维基。
检查区域设置和语言环境
要列出可用(已知)的区域设置,请运行以下任一命令(输出略有不同)。
locale -a
localectl list-locales
要检查(已)生成的语言环境,请运行以下命令。
localedef --list-archive
要检查当前使用的区域设置,请运行以下任一命令(输出略有不同)。
locale
localectl
设置和生成(新)区域设置
通常通过取消注释行来设置区域设置/etc/locale.gen
,然后locale-gen
需要运行。
nano /etc/locale.gen # uncomment desired lines (locales)
locale-gen
这将为 中和 下的/usr/lib/locale/locale-archive
每个未注释的行编译(生成)语言环境,无论它们之前是否被编译过。/etc/locale.gen
/var/lib/locales/supported.d/
或者,命令
locale-gen <locale>
将在生成所需的语言环境时取消注释相应的行locale-gen
,并且仅生成这一行。
注意: 的实现locale-gen
取决于发行版。例如,上述命令在 Ubuntu/Debian 中有效,但在 ArchLinux 中无效。
删除区域设置
发出 时locale-gen
,已编译的存档将被删除,并且所有/etc/locale.gen
和 下的语言环境/usr/lib/locale/locale-archive
都将重新生成。该命令locale-gen --purge <locale>
不会执行修饰符所建议的操作,而是相反:它会删除除所指示的语言环境之外的所有已编译语言环境。要确保在locale-gen
发出 或 并执行更新时只生成特定语言环境,必须同时考虑/etc/locale.gen
和。/usr/lib/locale/locale-archive
要删除中的语言环境/etc/locale.gen
,只需注释掉所需的行并使用重新生成语言环境即可locale-gen
。
删除 下的语言环境/var/lib/locales/supported.d/
比较棘手。由于任何文件都/var/lib/locales/supported.d/<code>
依赖于 软件包language-pack-<code>-base
,因此当 软件包更新时,前者的任何更改都将恢复。要解决这个问题,只需保留 下更新文件的软件包/var/lib/locales/supported.d/
。在 Ubuntu/Debian 中实现此目的的命令如下。
apt-mark language-pack-<code>-base
要更新保留的包,您必须取消标记或者简单地--ignore-hold
。
解决方法。一个更具侵入性但更通用的解决方案,可以防止更改,/var/lib/locales/supported.d/
方法是使用“不可变(i)”属性。因此,不要删除文件,而是清空它们。例如:
cd /var/lib/locales/supported.d/
rm <code> && touch <code> # <code> has been emptied
lsattr <code> # regular attributes
chattr +i <code> # adding (+) immutable
lsattr <code> # checking attributes
设置区域
设置和生成区域设置不会设置系统区域设置。以下任何命令都可以实现此目的。
echo LANG=<code> | sudo tee /etc/locale.conf # reboot (might be ignored in Ubuntu)
localectl set-locale LANG=<code>
答案2
你应该编辑/etc/locale.gen
并注释掉你不想要的区域设置。然后运行
sudo locale-gen
不存在名为 的任何语言环境en
。您可能想要使用的语言环境是en_US.UTF-8
而不是en_US
。(后者启用 latin1 编码。)
答案3
我的机器上安装了哪些语言环境?
您可以使用 locale 命令检查系统上生成和配置了哪些语言环境:
locale
... 列出当前的区域设置配置locale -a
...列出系统上生成的所有语言环境locale -a -v
... 列出所有语言环境并显示有用的附加信息(例如包含语言环境信息数据文件的目录名称)
上面的最后一个命令让你看到所有生成的语言环境都位于/usr/lib/locale/
,如果不需要,您可以删除其中任何一个。每个语言环境信息包都是一个包含文本文件和其他目录的目录。
支持的区域设置
您希望系统支持的所有语言环境都列在/var/lib/locales/supported.d/
.这些文件有两列,语言标签和字符映射表。
我希望我的系统只识别美式英语,所以我只有一个文件,叫做en
,其中仅包含一行:
en_US UTF-8
错误消息
如果在发出 locale 命令时显示错误消息,例如
locale: Cannot set LC_ALL to default locale: No such file or directory
确保文件/etc/default/locale
存在并且具有适当的内容,例如:
LANG="en_US"
LANGUAGE="en_US:en"
删除不需要的语言环境数据 - 一步一步
现在我们知道了开始清理系统的区域设置信息所需的所有详细信息:
- 编辑语言环境文件
/var/lib/locales/supported.d/
,并删除所有不需要的语言环境(每行一个语言环境) - 创建和编辑
/etc/default/locale
(见上文示例) - 删除所有生成的语言环境数据:
rm -rfv /usr/lib/locale/*
- 重新生成新的区域设置:
locale-gen
就这样!重新启动计算机以使更改生效。然后运行上面的一个或多个 locale 命令示例以确保结果符合预期。
参考: