msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2020-08-15 20:29+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 2.2.5\n" #. type: Content of: msgid "Setting Up the Environment" msgstr "配置环境" #. type: Content of: <sect1><para> msgid "" "Set up a good working environment by creating two new startup files for the " "<command>bash</command> shell. While logged in as user <systemitem class=" "\"username\">lfs</systemitem>, issue the following command to create a new " "<filename>.bash_profile</filename>:" msgstr "" "为了配置一个良好的工作环境,我们为 <command>bash</command> 创建两个新的启动脚" "本。以 <systemitem class=\"username\">lfs</systemitem> 的身份,执行以下命令," "创建一个新的 <filename>.bash_profile</filename>:" #. type: Content of: <sect1><screen> #, no-wrap msgid "" "<userinput>cat > ~/.bash_profile << \"EOF\"\n" "<literal>exec env -i HOME=$HOME TERM=$TERM PS1='\\u:\\w\\$ ' /bin/bash</literal>\n" "EOF</userinput>" msgstr "" "<userinput>cat > ~/.bash_profile << \"EOF\"\n" "<literal>exec env -i HOME=$HOME TERM=$TERM PS1='\\u:\\w\\$ ' /bin/bash</literal>\n" "EOF</userinput>" # swap two labels #. type: Content of: <sect1><para> msgid "" "When logged on as user <systemitem class=\"username\">lfs</systemitem>, the " "initial shell is usually a <emphasis>login</emphasis> shell which reads the " "<filename>/etc/profile</filename> of the host (probably containing some " "settings and environment variables) and then <filename>.bash_profile</" "filename>. The <command>exec env -i.../bin/bash</command> command in the " "<filename>.bash_profile</filename> file replaces the running shell with a " "new one with a completely empty environment, except for the <envar>HOME</" "envar>, <envar>TERM</envar>, and <envar>PS1</envar> variables. This ensures " "that no unwanted and potentially hazardous environment variables from the " "host system leak into the build environment. The technique used here " "achieves the goal of ensuring a clean environment." msgstr "" "在以 <systemitem class=\"username\">lfs</systemitem> 用户登录时,初始的 " "shell 一般是一个<emphasis>登录</emphasis> shell。它读取宿主系统的 <filename>/" "etc/profile</filename> 文件 (可能包含一些设置和环境变量),然后读取 " "<filename>.bash_profile</filename>。我们在 <filename>.bash_profile</" "filename> 中使用 <command>exec env -i.../bin/bash</command> 命令,新建一个除" "了 <envar>HOME</envar>, <envar>TERM</envar> 以及 <envar>PS1</envar> 外没有任" "何环境变量的 shell,替换当前 shell,防止宿主环境中不必要和有潜在风险的环境变" "量进入编译环境。通过使用以上技巧,我们创建了一个干净环境。" #. type: Content of: <sect1><para> msgid "" "The new instance of the shell is a <emphasis>non-login</emphasis> shell, " "which does not read, and execute, the contents of <filename>/etc/profile</" "filename> or <filename>.bash_profile</filename> files, but rather reads, and " "executes, the <filename>.bashrc</filename> file instead. Create the " "<filename>.bashrc</filename> file now:" msgstr "" "新的 shell 实例是 <emphasis>非登录</emphasis> shell,它不会读取和执行 " "<filename>/etc/profile</filename> 或者 <filename>.bash_profile</filename> 的" "内容,而是读取并执行 <filename>.bashrc</filename> 文件。现在我们就创建一个 " "<filename>.bashrc</filename> 文件:" #. type: Content of: <sect1><screen> #, no-wrap msgid "" "<userinput>cat > ~/.bashrc << \"EOF\"\n" "<literal>set +h\n" "umask 022\n" "LFS=/mnt/lfs\n" "LC_ALL=POSIX\n" "LFS_TGT=$(uname -m)-lfs-linux-gnu\n" "PATH=/usr/bin\n" "if [ ! -L /bin ]; then PATH=/bin:$PATH; fi\n" "PATH=$LFS/tools/bin:$PATH\n" "export LFS LC_ALL LFS_TGT PATH</literal>\n" "EOF</userinput>" msgstr "" "<userinput>cat > ~/.bashrc << \"EOF\"\n" "<literal>set +h\n" "umask 022\n" "LFS=/mnt/lfs\n" "LC_ALL=POSIX\n" "LFS_TGT=$(uname -m)-lfs-linux-gnu\n" "PATH=/usr/bin\n" "if [ ! -L /bin ]; then PATH=/bin:$PATH; fi\n" "PATH=$LFS/tools/bin:$PATH\n" "export LFS LC_ALL LFS_TGT PATH</literal>\n" "EOF</userinput>" #. type: Content of: <sect1><variablelist><title> msgid "The meaning of the settings in <filename>.bashrc</filename>" msgstr "<filename>.bashrc</filename> 中设定的含义:" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>set +h</parameter>" msgstr "<parameter>set +h</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "The <command>set +h</command> command turns off <command>bash</command>'s " "hash function. Hashing is ordinarily a useful feature—<command>bash</" "command> uses a hash table to remember the full path of executable files to " "avoid searching the <envar>PATH</envar> time and again to find the same " "executable. However, the new tools should be used as soon as they are " "installed. By switching off the hash function, the shell will always search " "the <envar>PATH</envar> when a program is to be run. As such, the shell will " "find the newly compiled tools in <filename class=\"directory\">$LFS/tools</" "filename> as soon as they are available without remembering a previous " "version of the same program in a different location." msgstr "" "<command>set +h</command> 命令关闭 <command>bash</command> 的散列功能。一般情" "况下,散列是很有用的 —— <command>bash</command> 使用一个散列表维护各个可执行" "文件的完整路径,这样就不用每次都在 <envar>PATH</envar> 指定的目录中搜索可执行" "文件。然而,在构建 LFS 时,我们希望总是使用最新安装的工具。因此,需要关闭散列" "功能,使得 shell 在运行程序时总是搜索 <envar>PATH</envar>。这样,shell 总是能" "够找到 <filename class=\"directory\">$LFS/tools</filename> 目录中那些最新编译" "的工具,而不是使用之前记忆的另一个目录中的程序。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>umask 022</parameter>" msgstr "<parameter>umask 022</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "Setting the user file-creation mask (umask) to 022 ensures that newly " "created files and directories are only writable by their owner, but are " "readable and executable by anyone (assuming default modes are used by the " "<function>open(2)</function> system call, new files will end up with " "permission mode 644 and directories with mode 755)." msgstr "" "将用户的文件创建掩码 (umask) 设定为 022,保证只有文件所有者可以写新创建的文件" "和目录,但任何人都可读取、执行它们。(如果 <function>open(2)</function> 系统调" "用使用默认模式,则新文件将具有权限码 644,而新目录具有权限码 755)。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>LFS=/mnt/lfs</parameter>" msgstr "<parameter>LFS=/mnt/lfs</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "The <envar>LFS</envar> variable should be set to the chosen mount point." msgstr "<envar>LFS</envar> 环境变量必须被设定为之前选择的挂载点。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>LC_ALL=POSIX</parameter>" msgstr "<parameter>LC_ALL=POSIX</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "The <envar>LC_ALL</envar> variable controls the localization of certain " "programs, making their messages follow the conventions of a specified " "country. Setting <envar>LC_ALL</envar> to <quote>POSIX</quote> or <quote>C</" "quote> (the two are equivalent) ensures that everything will work as " "expected in the chroot environment." msgstr "" "<envar>LC_ALL</envar> 环境变量控制某些程序的本地化行为,使得它们以特定国家的" "语言和惯例输出消息。将 <envar>LC_ALL</envar> 设置为 <quote>POSIX</quote> 或" "者 <quote>C</quote>(这两种设置是等价的) 可以保证在 chroot 环境中所有命令的行" "为完全符合预期,而与宿主的本地化设置无关。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>LFS_TGT=(uname -m)-lfs-linux-gnu</parameter>" msgstr "<parameter>LFS_TGT=(uname -m)-lfs-linux-gnu</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "The <envar>LFS_TGT</envar> variable sets a non-default, but compatible " "machine description for use when building our cross compiler and linker and " "when cross compiling our temporary toolchain. More information is contained " "in <xref linkend=\"ch-tools-toolchaintechnotes\" role=\"\"/>." msgstr "" "<envar>LFS_TGT</envar>变量设定了一个非默认,但与宿主系统兼容的机器描述符。该" "描述符被用于构建交叉编译器和交叉编译临时工具链。<xref linkend=\"ch-tools-" "toolchaintechnotes\" role=\"\"/>包含了关于这个描述符的更多信息。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>PATH=/usr/bin</parameter>" msgstr "<parameter>PATH=/usr/bin</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "Many modern linux distributions have merged <filename class=\"directory\">/" "bin</filename> and <filename class=\"directory\">/usr/bin</filename>. When " "this is the case, the standard <envar>PATH</envar> variable needs just to be " "set to <filename class=\"directory\">/usr/bin/</filename> for the <xref " "linkend=\"chapter-temporary-tools\"/> environment. When this is not the " "case, the following line adds <filename class=\"directory\">/bin</filename> " "to the path." msgstr "" "许多现代 Linux 发行版合并了 <filename class=\"directory\">/bin</filename> 和 " "<filename class=\"directory\">/usr/bin</filename>。在这种情况下,标准 " "<envar>PATH</envar> 变量只需要被设定为 <filename class=\"directory\">/usr/" "bin</filename>,即可满足<xref linkend=\"chapter-temporary-tools\"/>的环境。否" "则,后续命令将会增加 <filename class=\"directory\">/bin</filename> 到搜索路径" "中。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>if [ ! -L /bin ]; then PATH=/bin:$PATH; fi</parameter>" msgstr "<parameter>if [ ! -L /bin ]; then PATH=/bin:$PATH; fi</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "If <filename class=\"directory\">/bin</filename> is not a symbolic link, " "then it has to be added to the <envar>PATH</envar> variable." msgstr "" "如果 <filename class=\"directory\">/bin</filename> 不是符号链接,则它需要被添" "加到 <envar>PATH</envar> 变量中。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>PATH=$LFS/tools/bin:$PATH</parameter>" msgstr "<parameter>PATH=$LFS/tools/bin:$PATH</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "By putting <filename class=\"directory\">$LFS/tools/bin</filename> ahead of " "the standard <envar>PATH</envar>, the cross-compiler installed at the " "beginning of <xref linkend=\"chapter-cross-tools\"/> is picked up by the " "shell immediately after its installation. This, combined with turning off " "hashing, limits the risk that the compiler from the host be used instead of " "the cross-compiler." msgstr "" "我们将 <filename class=\"directory\">$LFS/tools/bin</filename> 附加在默认的 " "<envar>PATH</envar> 环境变量之前,这样在<xref linkend=\"chapter-cross-tools" "\"/>中,我们一旦安装了新的程序,shell 就能立刻使用它们。这与关闭散列功能相结" "合,降低了在第 5 章环境中新程序可用时错误地使用宿主系统中旧程序的风险。" #. type: Content of: <sect1><variablelist><varlistentry><term> msgid "<parameter>export LFS LC_ALL LFS_TGT PATH</parameter>" msgstr "<parameter>export LFS LC_ALL LFS_TGT PATH</parameter>" #. type: Content of: <sect1><variablelist><varlistentry><listitem><para> msgid "" "While the above commands have set some variables, in order to make them " "visible within any sub-shells, we export them." msgstr "" "前面的命令设定了一些变量,为了让所有子 shell 都能使用这些变量,需要导出它们。" #. type: Content of: <sect1><important><para> msgid "" "Several commercial distributions add a non-documented instantiation of " "<filename>/etc/bash.bashrc</filename> to the initialization of " "<command>bash</command>. This file has the potential to modify the " "<systemitem class=\"username\">lfs</systemitem> user's environment in ways " "that can affect the building of critical LFS packages. To make sure the " "<systemitem class=\"username\">lfs</systemitem> user's envronment is clean, " "check for the presence of <filename>/etc/bash.bashrc</filename> and, if " "present, move it out of the way. As the <systemitem class=\"username" "\">root</systemitem> user, run:" msgstr "" "一些商业发行版在 <command>bash</command> 初始化过程中,未做文档说明地增加了 " "<filename>/etc/bash.bashrc</filename>。该文件可能修改 <systemitem class=" "\"username\">lfs</systemitem> 用户的环境,并影响 LFS 关键软件包的构建。为了保" "证 <systemitem class=\"username\">lfs</systemitem> 用户环境的纯净,检查 " "<filename>/etc/bash.bashrc</filename> 是否存在,如果它存在就将它移走。以 " "<systemitem class=\"username\">root</systemitem> 用户身份,运行:" #. type: Content of: <sect1><important><screen> #, no-wrap msgid "<userinput>[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE</userinput>" msgstr "<userinput>[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE</userinput>" #. type: Content of: <sect1><important><para> msgid "" "After use of the <systemitem class=\"username\">lfs</systemitem> user is " "finished at the beginning of <xref linkend=\"chapter-chroot-temporary-tools" "\"/>, you can restore <filename>/etc/bash.bashrc</filename> (if desired)." msgstr "" "在<xref linkend=\"chapter-chroot-temporary-tools\"/>一章开始后,就不再使用 " "<systemitem class=\"username\">lfs</systemitem> 用户,您 (如果希望的话) 可以" "复原 <filename>/etc/bash.bashrc</filename> 文件。" #. type: Content of: <sect1><important><para> msgid "" "Note that the LFS Bash package we will build in <xref linkend=\"ch-system-" "bash\"/> is not configured to load or execute <filename>/etc/bash.bashrc</" "filename>, so this file is useless on a completed LFS system." msgstr "" "注意我们将会在<xref linkend=\"ch-system-bash\"/>中构建的 LFS Bash 软件包未被" "配置为读取或执行 <filename>/etc/bash.bashrc</filename>,因此它在完整的 LFS 系" "统中没有作用。" #. type: Content of: <sect1><para> msgid "" "Finally, to have the environment fully prepared for building the temporary " "tools, source the just-created user profile:" msgstr "" "最后,为了完全准备好编译临时工具的环境,指示 shell 读取刚才创建的配置文件:" #. type: Content of: <sect1><screen> #, no-wrap msgid "<userinput>source ~/.bash_profile</userinput>" msgstr "<userinput>source ~/.bash_profile</userinput>"