我对LFS建议的设置有一些疑问。
问题:
cat> 〜/ .bash_profile<< “EOF” exec env -i HOME = $ HOME TERM = $ TERM PS1 ='\ u:\ w \ $'/ bin / bash EOF
大部分内容都得到了很好的解释,但也许这部分比我预期的更具技术性,它还涉及一些我想更详细了解的重要概念。我用粗体标记了一些命令,我无法理解他们在做什么。
来自: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,除了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可确保新创建的文件和目录只能由其所有者写入,但任何人都可以读取和执行(假设打开使用默认模式(2) )系统调用,新文件将以权限模式644和模式755的目录结束。
应将LFS变量设置为所选的安装点。
LC_ALL变量控制某些程序的本地化,使其消息遵循指定国家/地区的惯例。如果主机系统使用早于2.2.4的Glibc版本,将LC_ALL设置为“POSIX”或“C”以外的其他内容(在本章中)可能会导致问题,如果您退出chroot环境并希望返回后即可。将LC_ALL设置为“POSIX”或“C”(两者是等效的)可确保一切都在chroot环境中按预期工作。
LFS_TGT变量设置非默认但兼容的机器描述,以便在构建交叉编译器和链接器时以及交叉编译临时工具链时使用。更多信息请参见第5.2节“工具链技术说明”。
最后,要为构建临时工具做好充分准备,请获取刚刚创建的用户配置文件:
source ~/.bash_profile
答案 0 :(得分:0)
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仍然是相同的。< / p>