“bash:警告:setlocale:LC_ALL:无法更改区域设置” - 误导?这是什么意思?

“bash:警告:setlocale:LC_ALL:无法更改区域设置” - 误导?这是什么意思?

我想了解语言环境如何工作。特别是我读过“-bash:警告:setlocale:LC_ALL:无法更改区域设置(en_US.UTF-8)”https://askubuntu.com/questions/114759/warning-setlocale-lc-all-cannot-change-locale

在我的 Linux Mint 上我做了locale-gen fr_FR.*,之后LC_ALL=fr_FR.UTF-8输出“bash:警告:setlocale:LC_ALL:无法更改区域设置(fr_FR.UTF-8)”。然而,locale之后显示“LC_NAME=fr_FR.UTF-8”等,因此区域设置变量被更改。为什么要写“无法更改区域设置”?

我做了LC_NAME=qq_QQ.UTF-8(不存在?区域设置),结果是相同的 - 警告,locale输出已更新。

我注意到,只有在 bash 终端启动之前已经生成新分配的情况下,才会出现警告。与此一致,bash -c "LC_NAME=fr_FR.UTF-8"没有产生任何警告。

命令来自https://askubuntu.com/questions/114759/warning-setlocale-lc-all-cannot-change-locale sudo update-locale LANG=fr_FR并没有摆脱警告。

我怀疑当前的 bash 会话保留了/etc/defaults/locale其他文件,因此locale-gen对此没有影响。正确的?strace输出对于我来说太复杂了,我无法阅读,我只是还没有找到/etc/defaults/locale它。

添加:

系统 Linux Mint 20.2(基于 Ubuntu)。我使用了locale-gen name.*IIRC 因为我在某处读过该行并且输出显示它正是namewere的语言环境done。现在,在阅读答案和手册页后,我尝试在runlocale-gen中注释掉 name.* ,然后取消注释并再次运行。运行结果和之前一样/etc/locale.gensudo locale-genname.UTF-8sudo locale-genlocale-gen name.*

答案1

您的警告表明您请求的区域设置实际上尚未编译。所以,你应该使用:

sudo dpkg-reconfigure locales

选择要编译的区域设置。

或者,只需编辑文件:

/etc/locale.gen

并取消注释所需的区域设置,然后运行:

sudo locale-gen

来生成它们。

什么是区域设置变量?

语言环境环境变量只是 C 库 ( ) 赋予特殊含义的常规环境变量glibc。具体来说,当程序通过调用setlocale(LC_ALL, "");或类似方式请求激活本地化支持时,将使用这些变量。此时,C 库将从/usr/lib/locale/.

这些本地化设置由实用localedef程序使用/usr/share/locale.在 Debian、Ubuntu 和相关发行版中,localedef被称为locale-gen.

为什么locale-gen fr_FR.*不起作用

locale-gen不从命令行获取任何参数。它仅读取/etc/locale.gen以确定要生成的区域设置。因此,根据/etc/locale.gen文件中未注释的区域设置,您的locale-gen fr_FR.*命令可能不会产生预期的效果。

update-locale命令只是包维护者脚本的一个工具,用于更新/etc/default/locale.它对于实际要编译的语言环境完全没有影响。

相关内容