昨天更新我的 Arch Linux 系统后,我开始收到类似这样的错误:
Failed to set locale. Fix your system.
此特定错误来自尝试运行 snapper。但是,这是另一个相关的错误:
bsdcpio: Failed to set default locale
perl 给出了一个类似的警告,我将在下面粘贴。
它不限于任何特定的应用程序;这似乎是一个系统范围的问题。
在昨天的更新之前,我没有收到这些错误。此外,我没有在虚拟控制台中收到错误。我只有在 X (KDE) 中才能得到它们。例如,如果我在 konsole 中运行 snapper ls 命令,我会收到上述错误,但如果我在虚拟控制台中运行相同的 snapper ls 命令,我不会收到任何错误。
我的其他几乎相同的 Arch 系统没有这个问题。
我的第一次故障排除尝试如下。
- 检查 /etc/locale.conf
- 跑
locale-gen
- 检查输出
locale
- 查看 snapper 是否运行没有错误
我在 locale.conf 中没有看到任何错误,但运行local-gen
并不能解决问题。
这是相关的输出:
# localectl list-locales
en_US.utf8
# grep -v "^#" /etc/locale.conf
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
# locale-gen
Generating locales...
en_US.UTF-8... done
Generation complete.
# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
# locale -a
C
en_US.utf8
POSIX
这是 perl 的警告:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "",
LC_ALL = (unset),
LC_MEASUREMENT = "en_US.UTF-8",
LC_PAPER = "en_US.UTF-8",
LC_MONETARY = "en_US.UTF-8",
LC_NAME = "en_US.UTF-8",
LC_COLLATE = "en_US.UTF-8",
LC_CTYPE = "en_US.UTF-8",
LC_ADDRESS = "en_US.UTF-8",
LC_NUMERIC = "en_US.UTF-8",
LC_MESSAGES = "en_US.UTF-8",
LC_TELEPHONE = "en_US.UTF-8",
LC_IDENTIFICATION = "en_US.UTF-8",
LC_TIME = "en_GB.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
当我locale
在 Konsole(在 X 中)中运行时会出现以下行,但在虚拟控制台中运行时不会出现:locale
locale: Cannot set LC_ALL to default locale: No such file or directory
我可以在虚拟控制台中运行 snapper ls 命令而不会出错。
据我所知,Arch 没有/etc/default/locale
. 我的任何 Arch 机器上都不存在该文件。
重新启动系统没有帮助。
您的语言环境设置之一(即
LC_TIME
)设置为您尚未生成的语言环境(即en_GB.UTF-8
)。如果您启用该语言环境并重新生成语言环境,该错误将消失/etc/locale.gen
。由于该设置与 中的设置不同
/etc/locale.conf
,您可能已在其中一个启动脚本中设置了覆盖。由于错误不会发生在虚拟控制台中,我怀疑.xinitrc
或.xprofile
. 但是,如果您使用的是完整的桌面环境,它们通常有自己的设置,包括区域设置。如果使用 KDE (KDE5),另一个可能存在覆盖的地方:
这可以在 KDE 系统设置中进行配置。
基本上,如果
locale
输出与 中配置的不同/etc/locale.conf
,则意味着存在某些覆盖。正如 Fox 之前回答的那样,应该启用/etc/locale.gen
并重新生成缺少的语言环境,或者/etc/locale.conf
任何其他语言环境配置都应该使用/etc/locale.gen
.这也解决了例如 bsdtar 的问题:
bsdtar: Failed to set default locale