9.7. Bash Shell 启动文件

Shell 程序 /bin/bash (之后简称 “shell”) 使用一组启动文件,以帮助创建运行环境。每个文件都有专门的用途,它们可能以不同方式影响登录和交互环境。/etc 中的文件提供全局设定。如果在用户主目录中有对应的文件存在,它们可能覆盖全局设定。

在成功登录后,/bin/login 读取 /etc/passwd 中的 shell 命令行,启动一个交互式登录 shell。通过命令行 (如 [prompt]$/bin/bash) 启动的 shell 是交互式非登录 shell。非交互 shell 通常在运行 shell 脚本时存在,它处理脚本,在执行命令的过程中不等待用户输入,因此是非交互的。

如果需要更多信息,阅读 Bash info 页面 (info bash) Bash Features 一章中的 Bash Startup Files 和 Interactive Shells 这两节。

登录 shell 会读取文件 /etc/profile 和 ~/.bash_profile。

下面给出最基本的 /etc/profile 文件,它设定本地语言支持所需的一些环境变量。正确设定它们有以下好处:

将下面的 <ll>替换为所需语言的双字符代号 (例如 “en”),<CC> 替换为国家或地区的双字符代号 (例如 “GB”),<charmap> 替换为您选定的 locale 的标准字符映射。另外,还可以加入 “@euro” 等可选修饰符。

Glibc 支持的所有 locale 可以用以下命令列出:

locale -a

字符映射可能有多个别名,例如 “ISO-8859-1” 也可以称为 “iso8859-1” 或者 “iso88591”。某些程序不能正确处理一些别名 (例如,“UTF-8”必须写作“UTF-8”才能识别,而不能识别“utf8”),因此在多数情况下,为了保险起见,最好使用 locale 的规范名称。为了确定规范名称,执行以下命令,将 <locale 名> 替换成 locale -a 对于您希望的 locale 的输出 (以 “en_GB.iso88591” 为例)。

LC_ALL=<locale 名> locale charmap

对于 “en_GB.iso88591” locale,以上命令输出:

ISO-8859-1

这样就最终确定 locale 应设置为 “en_GB.ISO-8859-1”。在将以上启发方法获得的 locale 添加到 Bash 启动文件之前,一定要进行下列测试:

LC_ALL=<locale 名> locale language
LC_ALL=<locale 名> locale charmap
LC_ALL=<locale 名> locale int_curr_symbol
LC_ALL=<locale 名> locale int_prefix

以上命令应该输出语言名称,选定 locale 使用的字符编码,本地货币符号,以及所在国家或地区的国际电话区号。如果以上某个命令失败并输出类似下面这样的消息,意味着您的 locale 在第 8.5 节 “Glibc-2.38”中没有安装,或者不被 Glibc 的默认安装支持。

locale: Cannot set LC_* to default locale: No such file or directory

如果出现了这种消息,您应该用 localedef 命令安装所需的 locale,或重新选择一个不同的 locale。后文假设 Glibc 没有输出类似错误消息。

其他软件包在 locale 名不符合它们的期望时可能工作不正常 (但未必输出错误消息)。在这种情况下,可以通过调研其他 Linux 发行版如何支持您的 locale,以获得一些有用的信息。

在确定了正确的 locale 设置后,创建 /etc/profile 文件:

cat > /etc/profile << "EOF"
# Begin /etc/profile

export LANG=<ll>_<CC>.<charmap><@modifiers>

# End /etc/profile
EOF

“C” (默认 locale) 和“en_US”(推荐美式英语用户使用的 locale) 是不同的。“C” locale 使用 US-ASCII 7 位字符集,并且将最高位“被设定”的字节视为无效字符。因此,ls 等命令会将它们显示为问号。另外,如果试图用 Mutt 或 Pine 发送包含这些字符的邮件,会发出不符合 RFC 标准的消息 (发出邮件的字符集会被标为“未知 8 位”)。因此,您只能在确信自己永远不需要 8 位字符时才能使用“C” locale。

一些程序不能很好地支持基于 UTF-8 的 locale。我们正在努力记录并 (如果可能的话) 修复它们。参阅 https://www.linuxfromscratch.org/blfs/view/12.0/introduction/locale-issues.html。