【问题标题】:Understanding LFS environment setup了解 LFS 环境设置
【发布时间】:2014-07-24 06:46:23
【问题描述】:

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

问题:

  • 这个命令到底在做什么

cat > ~/.bash_profile

  • 它提到“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

【问题讨论】:

    标签: linux bash shell ubuntu linux-from-scratch


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2013-05-16
      • 1970-01-01
      • 2020-05-24
      • 2021-12-31
      • 2017-08-30
      • 2013-11-28
      相关资源
      最近更新 更多