代码胜于雄辩:
root@myhost # locale-gen
Generating locales (this might take a while)...
(这里略过一点)
error: Bad entry 'en_GB '
en_GB.UTF-8... done
(这里略过一点)
en_SG.UTF-8... done
error: Bad entry 'en_US '
en_US.ISO-8859-1... done
en_US.UTF-8... done
error: Bad entry 'en_US.iso88591 '
error: Bad entry 'en_US.iso885915 '
en_ZA.UTF-8... done
(这里略过一点)
Generation complete.
为什么我会收到这些错误以及如何避免它们?
笔记:
- 我使用 Linux Mint 18.2,但这种情况是在(近?)过去的 Mint 18.1 的某个时刻开始发生的。我认为它们都基于 Ubuntu 16.04。
- 我在 ; 下没有找到包含这些“坏条目”(末尾有或没有额外空格)的文件
/etc
。具体来说不是/etc/locale.gen
。
附加信息:
相关内容/etc/locale.gen
:
# grep -v "#" /etc/locale.gen | sed "s/$/+/" | grep "en_"
en_GB.UTF-8 UTF-8+
en_US ISO-8859-1+
en_US.UTF-8 UTF-8+
答案1
locale-gen
是一个(写得不是很好的)bash
脚本。该错误由以下人员报告:
is_entry_ok() {
if [ -n "$locale" -a -n "$charset" ] ; then
true
else
echo "error: Bad entry '$locale $charset'"
false
fi
}
所以,这里的问题是$charset
空的。
要生成的语言环境列表是/etc/locale.gen
从/var/lib/locales/supported.d
.
可能其中一个文件本身en_US
不包含字符集名称。
由于您/etc/locale.gen
没有en_SG.UTF-8
,因此您很可能在 中有文件/var/lib/locale/supported.d
,并且这些文件可能具有格式错误的行。一旦确定了罪魁祸首,您就可以dpkg -S
在其路径上查看它来自哪个包(如果有)。
答案2
编辑:此解决方法可能不是最佳解决方案;但它确实有效。
基于@StephaneChazelas'回答,我发现问题出在/var/lib/locales/supported.d/mintlocale
- 一个特定于我的发行版 Linux Mint 的文件。它是错误生成的,大多数(不是全部)行没有字符集字段,例如:
en_GB
en_GB.iso88591
en_GB.UTF-8 UTF-8
(跳过)
en_US
en_US.iso88591
en_US.iso885915
en_US.UTF-8 UTF-8
所以我需要做的是为所有内容生成第二个字段。基本上,这就是我所做的:
sed -i -r '/^[a-zA-Z_]*$/d' mintlocale
sed -i -r 's/.([^. ]+)$/.\1 \1/' mintlocale
sed -i -r 's/ iso8859([0-9]+)$/ISO-8859-\1/' mintlocale
因此,删除没有 .charset 后缀的行,在空格后复制 .charset 后缀,并更改 ISO 8859 字符集格式以匹配我们的内容/usr/shared/i18n/charmaps/
(否则我们会收到其他错误)。
最后,我重新运行locale-gen
,没有任何错误。
笔记:我不能 100% 确定是否删除无字符集行,因此欢迎对此发表评论。