53、从源码构建bash及相关操作指南
2026/6/8 9:46:44 网站建设 项目流程

从源码构建bash及相关操作指南

1. 获取bash

如果你能直接连接互联网,获取bash应该不成问题。bash主页位于 http://www.gnu.org/software/bash/bash.html ,从这里你可以找到当前发行版的最新详细信息以及获取途径。
若无法直接联网,你也可以通过向自由软件基金会(Free Software Foundation)直接订购CD-ROM来获取bash。订购方式有两种:一是通过网络订购页面 http://order.fsf.org ;二是通过以下联系方式:
- 地址:The Free Software Foundation (FSF),59 Temple Place – Suite 330,Boston, MA 02111 - 1307 USA
- 电话:+1 - 617 - 542 - 5942
- 传真:+1 - 617 - 542 - 2652
- 邮箱:order@fsf.org
此联系方式在2006年4月20日星期四太平洋夏令时11:45:40有效。

2. 解压归档文件

通过上述任意一种方法获取到归档文件后,需要将其解压并安装到系统中。解压操作可以在任意位置进行,这里假设在主目录下进行。不过,将其安装到系统中需要root权限。如果你不是具有root访问权限的系统管理员,仍然可以编译和使用bash,只是不能将其作为系统级实用程序进行安装。
解压步骤如下:
1. 解压缩归档文件:

gunzip bash - 3.1.tar.gz

若没有gunzip实用程序,可以用获取bash的相同方式获取它,或者使用gzip -d替代。
2. 解包归档文件:

tar -xf bash - 3.1.tar

-xf表示“从指定文件中提取归档材料”。执行此命令后,会在主目录下创建一个名为bash - 3.1的目录。

3. 归档文件内容

bash归档文件包含一个主目录(当前版本为bash - 3.1)以及一系列文件和子目录。你首先应该查看的文件如下:
| 文件名称 | 描述 |
| ---- | ---- |
| CHANGES | 自上一版本以来的错误修复和新特性的全面列表 |
| COPYING | bash的GNU Copyleft协议 |
| MANIFEST | 归档文件中所有文件和目录的列表 |
| NEWS | 自上一版本以来的新特性列表 |
| README | 关于编译bash的简短介绍和说明 |

同时,还需关注两个目录:
-doc:包含各种格式的与bash相关的信息。
-examples:包含启动文件、脚本和函数的示例。

4. 文档说明

doc目录中有一些值得阅读的文章。打印出bash的手册条目是很有必要的,这样可以结合使用。README文件对这些文件进行了简短总结。
你最常使用的文档是bash.1手册页。该文件采用troff格式,与手册页使用的格式相同。你可以使用文本格式化程序nroff处理它,并将输出通过管道传递给分页实用程序来阅读,例如:

nroff -man bash.1 | more

你还可以通过将其通过管道传递给行式打印机(lp)来打印。这个文档总结了你所使用的bash版本的所有功能,是你能获取到的最新参考资料。在安装该软件包后,也可以通过man工具获取此文档,但有时拥有一份纸质副本以便在上面做笔记会很方便。
其他文档包括:
-FAQ:常见问题解答文档。
-readline.3readline工具的手册条目。
-article.ms:一篇关于该shell的文章,由当前bash维护者Chet Ramey撰写。

5. 配置和构建bash

要直接编译bash很简单,只需依次输入以下命令:

./configure make

configure脚本会尝试确定你是否拥有各种实用程序和C库函数,并找出它们在系统中的位置。然后,它会将相关信息存储在config.h文件中,同时还会创建一个名为config.status的脚本,你可以运行该脚本来重新创建当前的配置信息。在configure运行期间,它会输出正在搜索的内容以及找到的位置信息。
configure脚本还会设置bash的安装位置,默认安装在/usr/local区域(可执行文件安装在/usr/local/bin,手册条目安装在/usr/local/man等)。如果你没有root权限,想将其安装在自己的主目录中,或者想将bash安装到其他位置,需要使用--exec - prefix选项为configure提供所需的路径。例如:

configure --exec - prefix=/usr

这指定了bash文件将被放置在/usr目录下。注意,configure更倾向于使用等号(=)来指定选项参数。
配置完成后,输入make命令来构建bash可执行文件。同时,还会生成一个名为bashbug的脚本,它允许你以bash维护者所需的格式报告错误。构建完成后,你可以通过输入./bash来检查bash可执行文件是否正常工作。
要安装bash,输入以下命令:

make install

这将创建所有必要的目录(bininfoman及其子目录),并将文件复制到这些目录中。如果你将bash安装在主目录中,务必将自己的bin路径添加到PATH中,将自己的man路径添加到MANPATH中。

bash几乎所有功能在预配置时都是启用的,但你可以通过在configure时使用--enable feature--disable feature命令行选项来定制自己的版本。以下是可配置的特性及其描述:
| 特性 | 描述 |
| ---- | ---- |
| alias | 支持别名 |
| arith - for - command | 支持类似C语言for语句的替代形式的for命令 |
| array - variables | 支持一维数组 |
| bang - history | 类似C - shell的历史扩展和编辑功能 |
| brace - expansion | 支持大括号扩展 |
| command - timing | 支持time命令 |
| cond - command | 支持[[条件命令 |
| cond - regexp | 支持在[[条件命令中使用=~二元运算符匹配POSIX正则表达式 |
| directory - stack | 支持pushdpopddirs目录操作命令 |
| disabled - builtins | 即使使用enable -n禁用了内置命令,是否仍可以使用builtin命令运行它 |
| dparen - arithmetic | 支持((...))算术运算 |
| help - builtin | 支持help内置命令 |
| history | 通过fchistory命令实现历史记录功能 |
| job - control | 如果操作系统支持,通过fgbgjobs实现作业控制 |
| multibyte | 如果操作系统提供必要支持,支持多字节字符 |
| net - redirections | 在重定向时,对/dev/tcp/HOST/PORT/dev/udp/HOST/PORT形式的文件名进行特殊处理 |
| process - substitution | 如果操作系统支持,是否进行进程替换 |
| prompt - string - decoding | 是否允许PS1PS2PS3PS4中的反斜杠转义字符 |
| progcomp | 可编程完成功能。如果未启用readline,此选项无效 |
| readline |readline编辑和历史记录功能 |
| restricted | 支持受限shell、shell的-r选项和rbash|
| select | 支持select结构 |
| usg - echo - default
xpg - echo - default | 使echo默认扩展反斜杠转义字符,无需-e选项。这将xpg_echoshell选项的默认值设置为on,使bash的echo行为更像《单一Unix规范第2版》中指定的版本 |

此外,还可以通过修改config.top.h文件来开启或关闭许多其他shell特性。有关此文件以及一般配置bash的更多详细信息,请参阅INSTALL文件。最后,要清理源目录并删除所有目标文件和可执行文件,输入以下命令:

make clean

在执行此命令之前,请确保已经运行了make install,否则需要从头开始重新运行安装过程。

6. 测试bash

可以对新构建的bash版本运行一系列测试,以检查其是否正常运行。这些测试是从早期版本的shell中报告的问题派生而来的脚本。在最新版本的bash上运行这些测试不应导致任何错误。
在bash主目录中输入以下命令来运行测试:

make tests

每个测试的名称会显示出来,同时会显示一些警告消息,然后开始运行测试。成功的测试通常不会产生输出(除非警告消息中另有说明)。
如果任何测试失败,你将看到一个列表,显示预期结果与实际发生情况之间的差异。如果出现这种情况,你应该向bash维护者提交错误报告,具体的报告方法请参考后续“报告错误”部分。

7. 潜在问题

尽管bash已经在大量不同的机器和操作系统上进行了安装,但偶尔仍会出现问题。通常这些问题并不严重,经过一些调查可以快速解决。
如果bash编译失败,首先要检查configure是否正确猜测了你的机器和操作系统。然后检查NOTES文件,其中包含一些特定Unix系统的相关信息。此外,还可以查看INSTALL文件,以获取如何为configure提供特定编译指令的额外信息。

以下是从源码构建bash及相关操作的流程图:

graph TD A[获取bash] --> B[解压归档文件] B --> C[了解归档文件内容] C --> D[查看文档说明] D --> E[配置和构建bash] E --> F[测试bash] F --> G{是否有测试失败} G -- 是 --> H[报告错误] G -- 否 --> I[完成] E --> J{是否编译失败} J -- 是 --> K[检查问题] K --> E J -- 否 --> F

在整个过程中,我们详细了解了如何从源码获取、解压、配置和构建bash,以及如何进行测试和处理潜在问题。通过这些步骤,你可以根据自己的需求定制bash环境,并确保其正常运行。在遇到问题时,按照相应的排查方法和报告流程,能够及时解决问题或向维护者反馈,以获得更好的使用体验。

从源码构建bash及相关操作指南

8. 将bash安装为登录shell

若想将bash设置为默认登录shell,可参照“设置bash为你的默认shell”的相关方法进行操作。

9. 示例参考

关于bash附带的示例,你可以查看相关内容获取具体示例。

10. 寻求帮助

无论软件有多好,文档有多详尽,你总会碰到一些难以理解或无法正常工作的情况。这时,仔细阅读文档是非常重要的。很多时候,文档能解答你的疑问,指出你操作中的错误。
若阅读文档后仍感到困惑,或确认软件存在问题,你可以向当地的bash专家请教以解决问题。若没有专家可咨询,你只能通过其他途径(目前仅能通过互联网)寻求帮助。

11. 提问方式

如果你有关于bash的问题,目前有两种途径可以获得解答:
- 发送邮件至bash - maintainers@gnu.org
- 将问题发布到USENET新闻组gnu.bash.bug

在这两种情况下,bash维护者或USENET上的专业人士会为你提供建议。提问时,尽量在主题行给出问题的有意义总结,可参考 http://www.catb.org/~esr/faqs/smart - questions.html 。

12. 报告错误

错误报告应发送至bug - bash@gnu.org,报告内容需包含bash的版本、运行的操作系统、用于编译bash的编译器、问题描述、问题产生的方式,若可能,还应提供问题的修复方案。最好使用随bash安装的bashbug脚本来完成报告。
在运行bashbug之前,请确保已将EDITOR环境变量设置为你喜欢的编辑器并进行了导出(bashbug默认使用Emacs,该编辑器可能未安装在你的系统中)。执行bashbug后,它会在编辑器中打开一个部分空白的报告表单,其中一些信息(如bash版本、操作系统版本等)会自动填充。下面简要介绍一下表单内容:
-From:字段:填写你的电子邮件地址,例如:

From: confused@wonderland.oreilly.com
  • Subject:字段:尽量填写有意义的问题摘要,替换方括号内的内容,方便维护者查找你的提交。
  • 接下来的几行是系统描述,无需修改。
  • Description:字段:详细描述问题以及与预期结果的差异。描述问题时尽量具体、简洁。
  • Repeat - By:字段:描述问题是如何产生的;如有必要,列出你使用的具体按键。有时你可能无法自行重现问题,但仍需填写导致问题出现的事件。尝试将问题简化到最小形式,例如,如果问题出在一个大的shell脚本中,尝试找出产生问题的部分并仅包含在报告中。
  • Fix:字段:如果你已经调查并找出问题所在,可以提供修复问题所需的补丁。如果你不清楚问题的原因,留空该字段即可。

如果维护者能轻松重现并识别问题,问题将得到更快的修复。所以请确保Repeat - By(理想情况下还有Fix)部分尽可能完善。同时,建议阅读 http://www.catb.org/~esr/faqs/smart - questions.html 。完成表单填写后,保存并退出编辑器,表单将自动发送给维护者。

13. 符号和命令索引

文档中涉及众多符号和命令,以下是部分常见符号和命令的索引说明:
| 符号/命令 | 说明 |
| ---- | ---- |
|-(dash) | 多种用途,如命令选项前缀等 |
|!(exclamation point) | 用于历史扩展等 |
|!!(double exclamation point) | 历史操作符,重复上一条命令 |
|$(dollar sign) | 用于变量引用等 |
|$$(double dollar sign) | 表示当前进程ID |
|$()| 用于命令替换 |
|$(( ))| 用于算术表达式 |
|$*| 表示所有位置参数 |
|$@| 表示所有位置参数,与$*有细微差别 |
|$?| 表示上一个命令的退出状态 |
|"(double quotes) | 用于字符串引用,保留部分特殊字符的含义 |
|'(single quote) | 用于字符串引用,不保留特殊字符的含义 |
|#(pound) | 用于注释,#!/bin/sh用于指定脚本解释器 |
|/(slash) | 路径分隔符 |
|&(ampersand) | 用于将命令放入后台执行 |
|&&(double - ampersands) | 逻辑与操作符 |
||(vertical bar) | 管道符号,用于连接命令 |
|||(double pipes) | 逻辑或操作符 |

14. 总结

从源码构建bash是一项具有一定技术含量但十分有用的操作。通过上述步骤,你可以从获取bash源码开始,依次完成解压、配置、构建、测试等操作,最终将bash安装到系统中并根据需求进行定制。同时,了解如何寻求帮助和报告错误,能让你在使用过程中遇到问题时及时解决。整个流程可以用以下流程图概括:

graph LR classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px A([开始]):::startend --> B(获取bash):::process B --> C(解压归档文件):::process C --> D(了解归档文件内容):::process D --> E(查看文档说明):::process E --> F(配置和构建bash):::process F --> G(测试bash):::process G --> H{测试是否成功}:::decision H -- 是 --> I(将bash设为登录shell):::process H -- 否 --> J(报告错误):::process J --> F I --> K(结束):::startend F --> L{编译是否失败}:::decision L -- 是 --> M(检查问题):::process M --> F L -- 否 --> G

按照这个流程,你可以顺利完成bash的从源码构建到使用的整个过程,并且在遇到问题时知道如何解决和反馈,从而更好地利用bash进行各种操作和开发。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询