0

我对 LFS 建议的设置有一些疑问。

问题:

  • 这个命令到底在做什么

cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF

  • 它提到“shell的新实例是非登录shell”所以我们必须设置.bashrc ....但是它并没有真正解释我们如何使用这个bashrc一旦创建。最后回到 bash_profile 。

其中大部分都得到了很好的解释,但对于本节而言,它可能比我预期的更具技术性,并且它还涉及一些我想更详细地理解的重要概念。我用粗体标记了一些我无法理解它们在做什么的命令。

来自:http ://www.linuxfromscratch.org/lfs/view/stable/chapter04/settingenvironment.html

通过为 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,它读取主机的 /etc/profile,然后读取 .bash_profile。.bash_profile 文件中的 exec env -i.../bin/bash 命令将正在运行的 shell 替换为具有完全空环境的新 shell,除了 HOME、TERM 和 PS1 变量。这可确保主机系统中的不需要和潜在危险的环境变量不会泄漏到构建环境中。

新的 shell 实例是一个非登录 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 的哈希函数。散列通常是一个有用的特性——bash 使用散列表来记住可执行文件的完整路径,以避免一次又一次地搜索 PATH 以找到相同的可执行文件。但是,新工具应在安装后立即使用。通过关闭散列函数,shell 将始终在程序运行时搜索 PATH。因此,一旦新编译的工具可用,shell 就会在 $LFS/tools 中找到它们,而无需记住同一程序在不同位置的先前版本。

将用户文件创建掩码 (umask) 设置为 022 可确保新创建的文件和目录只能由其所有者写入,但任何人都可以读取和执行(假设 open(2) 系统调用使用默认模式,新文件将以权限模式 644 和具有模式 755 的目录结束)。

LFS 变量应该设置为选择的挂载点。

LC_ALL 变量控制某些程序的本地化,使它们的消息遵循指定国家的约定。如果主机系统使用早于 2.2.4 的 Glibc 版本,如果您退出 chroot 环境并希望稍后返回,将 LC_ALL 设置为“POSIX”或“C”以外的其他值(在本章中)可能会导致问题。将 LC_ALL 设置为“POSIX”或“C”(两者是等价的)确保一切都将在 chroot 环境中按预期工作。

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

最后,要让环境为构建临时工具做好充分准备,请获取刚刚创建的用户配置文件:

source ~/.bash_profile
4

1 回答 1

0

请参阅Bash 启动文件

cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF

在那里,除了显式设置的环境变量之外,env调用一个新的交互式非登录 bash ( /bin/bash) 实例,忽略 ( ) 环境变量。-i非登录 bash 实例不读取.bash_profile,.bash_login.profile, 而是读取.bashrc. 但是登录实例会读取这些文件,但不会读取.bashrc. 由于env不传递-l/bin/bash,因此 bash 不会作为登录 shell 运行。

exec用 env 覆盖当前的 shell 进程。env另一方面exec, bash 所以就像所有旧 shell 都转换为新的 bash 但进程 ID 仍然是相同的。

于 2014-07-24T07:39:29.613 回答