解释导出 LANG、LC_CTYPE 和 LC_ALL 的效果 [关闭]
- 2024-11-07 08:55:00
- admin 原创
- 31
问题描述:
我刚刚安装了Linux Mint 17,但遇到一个问题,就是无法在终端中使用俄语。(我看到的?
是字母。)
在一个论坛上我找到了这个解决方案:
在〜/ .profile中添加:
export LANG=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
它有所帮助,但也将我的界面语言更改为俄语(我不想要)。这甚至不是问题,但无论如何,我想知道,这段代码是如何工作的(每一行)。
解决方案 1:
我将详细解释:
export LANG=ru_RU.UTF-8
这是一个 shell 命令,它将导出一个LANG
以给定值命名的环境变量ru_RU.UTF-8
。它指示国际化程序使用俄语 ( ru
)、俄罗斯变体 ( RU
) 和UTF-8
控制台输出的编码。
一般这一行就够了。
另一个:
export LC_CTYPE=ru_RU.UTF-8
执行类似操作,但它告诉程序不要更改语言,而只将 CTYPE更改为俄语。如果程序可以将文本更改为大写,那么它将使用俄语规则来执行此操作,即使文本本身可能是英文。
值得一提的是,混合LANG
和LC_CTYPE
可能会产生意想不到的结果,因为很少有人这样做,所以它还没有经过测试,除非可能:
export LANG=ru_RU.UTF-8
export LC_CTYPE=C
这将使程序以俄语输出,但 CTYPE 标准为旧 C 风格。
最后一行LC_ALL
是最后一个替代方法,它将使程序忽略所有其他LC_*
变量并使用此变量。我认为您永远不应该将其写在配置文件行中,而应该使用它来运行给定语言的程序。例如,如果您想编写错误报告,并且不想要任何类型的本地化输出,并且您不知道LC_*
设置了哪些变量:
LC_ALL=C program
关于更改所有程序的语言或仅更改控制台的语言,这取决于将这些行放在哪里。我将其放在这里,~/.bashrc
这样它们就不会应用于 GUI,而只会应用于 bash 控制台。
解决方案 2:
请参阅UNIX 规范页面的环境变量 ¹:
LANG
`LC_ALL在没有和其他
LC_*(
LC_COLLATE、
LC_CTYPE、
LC_MESSAGES、、 )环境变量
LC_MONETARY`的
情况下,此变量确定本地语言、当地习惯和编码字符集的区域设置类别。应用程序可以使用它来确定错误消息和说明、排序顺序、日期格式等要使用的语言。LC_NUMERIC
`LC_TIME`
LC_ALL
此变量确定所有语言环境类别的值。LC_ALL
环境变量的值优先于以 LC_ 开头的任何其他环境变量(LC_COLLATE、
LC_CTYPE
、LC_MESSAGES
、LC_MONETARY
、LC_NUMERIC
)LC_TIME
和LANG
环境变量。
LC_CTYPE
`tolower()此变量确定字符处理函数(例如、
toupper()和)的语言环境类别
isalpha()`。此环境变量确定文本数据字节序列作为字符的解释(例如,单字节字符而不是多字节字符)、字符的分类(例如,字母、数字、图形)以及字符类的行为。此变量的其他语义(如果有)取决于实现。
¹:OP 的第一个链接来自1997 年版本,而这个链接来自2008 年版本。
解决方案 3:
export
令人困惑。 它的实际意思是mark-for-export
。
这意味着稍后将创建子进程,然后完成实际的导出。
事件的顺序export
是:1-ASSIGN,MARK,和... 2-FORK。
1)创建一个新的本地shell变量,为其赋值,并标记此变量以供以后导出。
2)然后,如果当前shell脚本被FORKED(即创建并运行任何子进程),则启动一个子进程并使用该导出变量的副本作为其众多环境变量之一。
nb(请注意):直到第 2 步,并且可能在声明export
发出很久之后,变量才真正被导出。 因此: export
仅标记 LANG。它不导出 LANG。
按照惯例,导出的变量以大写字母命名。
因为 LANG 只是一个副本,所以如果子进程稍后修改此变量,它只会为自己修改。父进程看不到子进程的修改。
请注意,还有许多其他环境变量从父进程传递给子进程。其中包括父进程从其父进程获取的所有其他环境变量。
因此,子进程将继承父进程的所有环境变量,
+父进程标记的任何其他变量export
,
减去任何明确的变量
unset
。
换句话说,我们需要考虑两个进程:父进程和任何未来的子进程。
在这种情况下,您正在运行的进程profile
就是我们所说的“父进程”。
profile
可以生成一个或多个子进程,例如,如果您在配置文件中执行的操作之一是运行程序。然后,该程序(通常)作为 的子进程运行profile
。 (如果文件是在配置文件中使用或符号获取的,则情况并非如此,其中获取的内容与 在同一进程中运行。). <name>
`source <name>`profile
export LANG=ru_RU.UTF-8 export LC_CTYPE=ru_RU.UTF-8 export LC_ALL=ru_RU.UTF-8
现在我们来看看这三个环境变量的作用。
LANG 是用户通常设置的影响程序运行时的语言的变量。在终端中输入时,env | grep LANG
您应该会看到 LANG 设置为您的<language>_<country-code>.<character-encoding>
,例如 LANG=en_US.UTF-8。
LC_CTYPE 是 LANG 的覆盖,仅覆盖所使用的字符集。LANG 的所有其他功能(类别)仍按 LANG 的设置使用,例如 LC_TELEPHONE。
LC_ALL 是进一步的覆盖。它覆盖 LC_CTYPE 和由 LANG 设置为给定语言和代码集的所有区域设置类别。请注意,LC_ALL 不应像配置文件本身一样永久设置。它仅用作临时整个区域设置覆盖,即它覆盖所有类别,如 LC_TELEPHONE、LC_MONETARY、LC_CTYPE 等。
解决方案 4:
LANG
、LC_CTYPE
和是特殊的环境变量LC_ALL
,它们被导出到 shell 环境 ( help export
) 后,就可以供支持语言环境(C 的自然语言格式)的某些程序读取。
每个变量为特定的例程集设置 C 库的自然语言格式样式概念,例如:
LC_ALL
- 通用设置整个语言环境
LC_CTYPE
`ctype- 为和函数设置区域设置
multibyte`。这将控制对大小写、字母或非字母字符等的识别。
以及其他的,例如LC_COLLATE
(用于字符串整理例程)、LC_MESSAGES
(用于消息目录)、LC_MONETARY
(用于格式化货币值)、LC_NUMERIC
(用于格式化数字)、LC_TIME
(用于格式化日期和时间)。
至于LANG
,它被用来替代任何未设置的LC_*
变量(参见man locale
:)。
参见:man setlocale
(BSD),man locale
因此,当调用某些 C 函数(例如setlocale
,,,,,等)时,它们会从配置ctype
文件和本地环境中读取区域设置,以便根据 C 编程语言标准控制和格式化自然语言格式样式(参见:ISO C99)multibyte
`catopen`printf
另请参阅:C 库 - <locale.h>。
解决方案 5:
您的.bashrc
文件是第一个被读取的文件之一,它包含您的 shell 会话的各种配置。
来自.bashrc、.bash_profile 和 .environment 之间有什么区别?:
.bashrc 仅由交互式和非登录的 shell 读取
正如在使用或不使用 export 定义变量中所述:
导出使变量可供子流程使用。
或者
具体来说,导出使变量通过环境可供子进程使用。
莫尔
阅读@lhunath关于.bash_profile,.bashrc的回答,以及别名应该写在哪里?
使用点文件配置您的登录会话
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件