4.4. 设置工作环境
最后更新于:2022-04-01 22:47:33
# 4.4\. 设置工作环境
通过给 `bash` shell 创建两个新的启动文件来设置一个良好的工作环境。用 _lfs_ 用户登录,输入下面的命令来创建一个新的 `.bash_profile` 文件:
```
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
```
作为 _lfs_ 用户登录的时候,初始 shell 通常是一个_登陆_shell(_login_ shell),它会首先读取宿主系统的 `/etc/profile` 文件(可能包含一些设置和环境变量),然后继续读取 `.bash_profile` 文件来完成登录初始化。`.bash_profile` 文件中的 `exec env -i.../bin/bash` 命令用完全空的环境来取代当前的环境(除了继承 `HOME`, `TERM`, `PS1` 变量外)。这样能保证我们的编译环境不会被宿主系统中不必要的或者有潜在危险的环境变量所影响,从而确保获得一个干净的工作环境。
另一个新的 shell 实例是_非登陆_shell(_non-login_ shell),它不读取 `/etc/profile` 或 `.bash_profile` 文件,而是读取 `.bashrc` 文件。现在创建 `.bashrc` 文件:
```
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
```
`set +h` 命令关闭 `bash` 的 hash 功能,hash 通常是一个有用的特性:`bash` 使用一个 hash 表来记录可执行文件的完整路径,以避免为了找到同一个可执行文件而反复搜索 `PATH` 里的目录。然而,新工具装好之后就要立即使用,通过关闭 hash 功能,当要运行程序的时候,shell 将总是搜索 `PATH` 里的目录,这样新工具一编译好,shell 就可以在 `$LFS/tools` 目录里找到,而不是执行所记忆的其它地方的旧版本程序。
将用户文件创建掩码(umask)设为 022 ,使得新创建的文件和目录只有所有者可写,其他用户只能读取和运行(`open(2)` 系统调用的默认模式是新文件权限 644,新目录权限 755)。
`LFS` 环境变量应该设为所选择的挂载点。
`LC_ALL` 环境变量控制着某些程序的本地化,使其显示的信息遵循指定国家的惯例。如果宿主系统使用的 Glibc 版本低于 2.2.4,将 `LC_ALL` 环境变量设置为"POSIX"或"C"以外的值(在本章中)可能会在您退出虚根环境后再想返回的时候出现问题。请把 `LC_ALL` 设置为"POSIX"或"C"(这两者是等价的)以确保在虚根环境中的所有东西都像预期的那样正常工作。
通过把 `/tools/bin` 放在 `PATH` 的最前面,[第五章](../chapter05/chapter05.html)中所有的程序安装好后,就可以立即被 shell 运行。将这一点和关闭 hash 功能结合起来,预防了宿主系统的旧程序在不该运行的时候却被运行了的风险。
最后,为了完全准备好编译临时工具的工作环境,导入刚刚创建的 profile 文件:
```
source ~/.bash_profile
```
';