解释导出 LANG、LC_CTYPE 和 LC_ALL 的效果 [关闭]

2024-11-07 08:55:00
admin
原创
33
摘要:问题描述:我刚刚安装了Linux Mint 17,但遇到一个问题,就是无法在终端中使用俄语。(我看到的?是字母。)在一个论坛上我找到了这个解决方案:在〜/ .profile中添加:export LANG=ru_RU.UTF-8 export LC_CTYPE=ru_RU.UTF-8 export LC_ALL...

问题描述:

我刚刚安装了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更改为俄语。如果程序可以将文本更改为大写,那么它将使用俄语规则来执行此操作,即使文本本身可能是英文。

值得一提的是,混合LANGLC_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_COLLATELC_CTYPELC_MESSAGES、、 )环境变量LC_MONETARY`的
    情况下,此变量确定本地语言、当地习惯和编码字符集的区域设置类别。应用程序可以使用它来确定错误消息和说明、排序顺序、日期格式等要使用的语言。LC_NUMERIC`LC_TIME`

  • LC_ALL此变量确定所有语言环境类别的值。LC_ALL环境变量的值优先于以 LC_ 开头的任何其他环境变量(LC_COLLATE、
    LC_CTYPELC_MESSAGESLC_MONETARYLC_NUMERICLC_TIMELANG

环境变量。

  • LC_CTYPE`tolower()此变量确定字符处理函数(例如、toupper()和)的语言环境类别isalpha()`。此环境变量确定文本数据字节序列作为字符的解释(例如,单字节字符而不是多字节字符)、字符的分类(例如,字母、数字、图形)以及字符类的行为。此变量的其他语义(如果有)取决于实现。

¹:OP 的第一个链接来自1997 年版本,而这个链接来自2008 年版本。

解决方案 3:

export令人困惑。 它的实际意思是mark-for-export

这意味着稍后将创建子进程,然后完成实际的导出。


事件的顺序export是:1-ASSIGNMARK,和... 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:

LANGLC_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的回答,以及别名应该写在哪里?

  • 使用点文件配置您的登录会话

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用