出售域名  LinuxTags

7.9. Bash Shell 启动文件

Shell 程序 /bin/bash(此后以 “shell” 称呼)通过一个启动文件集合创个运行环境。每个文件都有特定的用处,有些文件在登录模式和交互模式不同时还有所不同。/etc 目录下的一些文件提供了全局设置。如果相类似的设置出现在某个用户的起始文件夹下,那么在该用户登入时,它将代替该全局设置。

使用 /bin/login 读取 /etc/passwd 文件成功登录后,启动了一个交互式登录 shell。用命令行可以启动一个交互式非登录 shell(例如[prompt]$/bin/bash)。非交互 shell 通常出现在 shell 脚本运行的时候。之所以称为非交互的,因为它正在运行一个脚本,并且命令与命令之间并不等待用户的输入。

要获得更多信息,请运行 info bash 以参考 Bash Startup Files and Interactive Shells 小节。

当以交互登录方式运行 shell 的时候,会读取 /etc/profile~/.bash_profile 文件。

下面是一个基本的 /etc/profile 文本,设置了本地语言支持所必需的环境变量,适当设置这些变量会导致:

  • 程序将产生翻译成本地语言的输出

  • 正确的将字符分类为字母、数字和其它类,这样做是必要的,可以让 bash 在非英语 locale 下正确接收命令行输入的非 ASCII 字符。

  • 为指定的国家设置正确的字母排序

  • 适当的默认页面大小

  • 为货币、时间和日期值设置正确的格式

把下面的 <ll> 换成您想要设置的两个字母的语言代码(例如 “en” );把 <CC> 换成适当的两个字母的国家代码 (例如 “GB” );把 <charmap> 换成规范的字符映射表。可选的更改比如 “@euro” 可能也有。

Glibc 支持的所有 locales 列表可以使用下列命令获得:

locale -a

很多 locale 有许多别名,比如 “ISO-8859-1” 也被称为 “iso8859-1” 和 “iso88591”。一些应用程序不能正确处理这些同义词(例如,要求 “UTF-8” 要写为 “UTF-8” ,而不是 “utf8” )。所以安全的做法是使用 locale 的规范名称。要确定正确的规范名称,运行下面的命令,并把其中的 <locale name> 替换成 locale -a 命令的输出中您喜欢的 locale ( 在这个例子中是 “en_GB.iso88591” )。

LC_ALL=<locale name> locale charmap

对于 “en_GB.iso88591” locale,上面的命令将会打印:

ISO-8859-1

这样你得到的正确的 locale 设置是 “en_GB.ISO-8859-1” 。把使用上述试探方法得到的 locale 在添加进 Bash 启动文件前做充分的测试是很重要的:

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

上述命令将会打印 locale 对应的国家和语言名称、使用的字符编码、货币符号、国际长途电话号码前缀。如果上述命令中的任何一个出现了类似下面的错误信息,则表明你的 locale 要么在 Chapter 6 中没有安装,要么不被 Glibc 的默认安装支持。

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

在这种情况下,您应当要么使用 localedef 命令安装相应的 locale,要么选择一个其他的 locale。接下来的指令都将假定 Glibc 没有出现上述错误信息。

一些 LFS 基本系统之外的软件包可能并不支持你选择的 locale 。其中之一就是 X 库(X Window System 的一部分)。如果 locale 在它的内部文件里没有准确匹配上一个字符映射,它会输出如下错误信息:

Warning: locale not supported by Xlib, locale set to C

在某些情况下,Xlib 希望字符集会以带破折号的大写字母方式列出。比如应该写 "ISO-8859-1" 而不是 "iso88591"。通过去掉 locale 中的 charmap 部分可以解决这一问题。在两种不同的设置下执行命令 locale charmap 可以检查它。例如,将 "de_DE.ISO-8859-15@euro" 修改为 "de_DE@euro" 即可让这个 locale 被 Xlib 正确识别。

如果您选择 locale 与它们的期望不符,有些软件包可能不能正常工作(但可能不会显示出任何错误信息)。在这种情况下,研究一下其他 Linux 发行版是如何支持你选择的 locale 可能会得到有用的信息。

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

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

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

# End /etc/profile
EOF

C”(默认)和 “en_US”(美国英语用户的推荐值)这两个 locale 是不同的。“C”用 US-ASCII 7 字节字符设置,并且把高位字节当作无效字符。这就是为什么ls命令在这样的 locale 下把非 ASCII 字符它们用问号来代替。同样,用 Mutt 或 Ping 发送的邮件中包含这样的字符会导致不符合 RFC 标准的信息被发送(发出邮件中的映射字符集被显示为“unknown 8-bit”)。所以,只有在你确信永不会用到 8 位字符时,才可以用 “C” locale。

基于 UTF-8 的 locales 不能很好地被很多程序支持。例如,watch 程序在 UTF-8 locale 只能显示 ASCII 字符,并且在传统 8 位 locale 像 en_US里没有这种限制。人们正在记录并在可能时修复这些问题,详情请参考 http://www.linuxfromscratch.org/blfs/view/svn/introduction/locale-issues.html


出售域名  LinuxTags

host by aosp.me  CDN