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, TERMPS1 变量外)。 这样能保证我们的编译环境不会被宿主系统中不必要的或者有潜在危险的环境变量所影响, 从而确保获得一个干净的工作环境。

另一个新的 shell 实例是非登陆shell(non-login shell),它不读取 /etc/profile.bash_profile 文件,而是读取 .bashrc 文件。现在创建 .bashrc 文件:

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT 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"以外的值 (在本章中) 可能会在您退出 chroot 环境后再想返回的时候出现问题。 请把 LC_ALL 设置为 “POSIX” 或 “C” (这两者是等价的) 以确保在 chroot 环境中的所有东西都像预期的那样正常工作。

LFS_TGT 变量设置一个非默认的,但是用于我们建立交叉编译器和链接器以及交叉编译我们的临时工具链时的兼容机器说明。 更多的信息包含在 Section 5.2, “工具链技术说明”.

通过把 /tools/bin 放在标准 PATH 文件最前面,使 Chapter 5 中所有的程序安装好后, 就可以立即被 shell 运行。将这一点和关闭 hash 功能结合起来, 预防了当第5章环境中的程序要运行时,宿主系统中的相同的程序被运行的风险。

最后,为了完全准备好编译临时工具的工作环境,导入刚刚创建的 profile 文件:

source ~/.bash_profile