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 等。