gpt4 book ai didi

linux - 了解 LFS 环境设置

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:23 25 4
gpt4 key购买 nike

我对 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 版本,则将 LC_ALL 设置为“POSIX”或“C”(本章中)之外的其他值如果您退出 chroot 环境并希望稍后返回,可能会导致问题。将 LC_ALL 设置为“POSIX”或“C”(两者是等效的)可确保一切都在 chroot 环境中按预期工作。

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

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

source ~/.bash_profile

最佳答案

参见Bash Startup Files

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 仍然是相同的。

关于linux - 了解 LFS 环境设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24926816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com