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

2024-11-07 08:55:00
admin
原创
167
摘要:问题描述:我刚刚安装了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的回答,以及别名应该写在哪里?

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用