Bash学习 - 第10章:Installing Bash

本文为 Bash Reference Manual第10章:Installing Bash 的读书笔记。

本章提供了在各种支持平台上安装 Bash 的基本说明。该发行版支持 GNU 操作系统、几乎所有版本的 Unix 以及一些非 Unix 系统,如 BeOS 和 Interix。对于 Windows 平台,也存在其他独立的移植版本。

10.1 Basic Installation

这些是 Bash 的安装说明。

编译 Bash 的最简单方法是:

  1. 进入包含源代码的目录,然后输入 './configure' 来配置 Bash 以适合您的系统。如果您在旧版本的 System V 上使用 csh,可能需要改为输入 'sh ./configure',以避免 csh 尝试自行执行 configure。

    运行 configure 需要一些时间。在运行过程中,它会显示正在检查的功能信息。

  2. 输入 'make' 来编译 Bash 并构建 bashbug 错误报告脚本。

  3. 可选,输入 'make tests' 来运行 Bash 测试套件。

  4. 输入 'make install' 来安装 bash 和 bashbug。这也会安装手册页和 Info 文件、消息翻译文件、一些补充文档、若干示例可加载内置命令,以及用于开发可加载内置命令的一套头文件。要将 bash 安装到目标位置,可能需要额外权限,这可能需要 'sudo make install'。有关控制 bash 和其他文件安装位置的更多信息,请参见下文(参见安装名称)。

    配置 shell 脚本尝试猜测在编译过程中使用的各种系统相关变量的正确值。它使用这些值在软件包的每个目录中创建 Makefile(顶层目录、builtins、doc、po 和 support 目录、lib 下的每个目录以及其他几个目录)。它还会创建一个包含系统相关定义的 config.h 文件。最后,它会创建一个名为 config.status 的 shell 脚本,你可以在以后运行该脚本来重新创建当前配置;一个 config.cache 文件,用于保存测试结果以加快重新配置速度;以及一个包含编译器输出的 config.log 文件(主要用于调试 configure)。如果有些时候 config.cache 包含你不想保留的结果,你可以删除或编辑它。

要了解 configure 脚本支持的选项和参数,请在 Bash 源目录中的 Bash 提示符下输入:

bash 复制代码
bash-4.2$ ./configure --help

如果你想在与源代码目录不同的目录中构建 Bash------例如,为多个架构构建------只需使用 configure 脚本的完整路径。以下命令将从 /usr/local/src/bash-4.4 的源代码在 /usr/local/build 下的目录中构建 Bash:

bash 复制代码
mkdir /usr/local/build/bash-4.4
cd /usr/local/build/bash-4.4
bash /usr/local/src/bash-4.4/configure
make

有关在与源代码不同的目录中构建的更多信息,请参见针对多架构编译

如果您需要采取一些不寻常的方法来编译 Bash,请尝试找出 configure 是否可以检查是否需要进行这些操作,并将差异或说明发邮件到 bash-maintainers@gnu.org,以便在下一个版本中考虑。

文件 configure.ac 用于通过一个名为 Autoconf 的程序创建 configure。只有在您想要更改它或使用更新版本的 Autoconf 重新生成 configure 时才需要 configure.ac。如果您这样做,请确保使用的是 Autoconf 2.69 或更新版本。

您可以通过输入 'make clean' 来从源代码目录中删除程序二进制文件和目标文件。要同时删除 configure 创建的文件(以便可以为不同类型的计算机编译 Bash),请输入 'make distclean'。

参考博客如何升级Bash,了解具体的安装和升级步骤。

10.2 Compilers and Options

有些系统在编译或链接时需要配置脚本不了解的特殊选项。你可以通过在环境中设置变量来为 configure 提供初始值。在兼容 Bourne 的 shell 中,你可以在命令行上这样做:

bash 复制代码
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure

在安装了 env 程序的系统上,你可以这样做:

bash 复制代码
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure

如果可用,配置过程会使用 GCC 来构建 Bash。

10.3 Compiling For Multiple Architectures

你可以同时为多种类型的计算机编译 Bash,只需将每种架构的目标文件放在各自的目录中即可。要做到这一点,你必须使用支持 VPATH 变量的 make 版本,例如 GNU make。切换到你希望放置目标文件和可执行文件的目录,然后从源代码目录运行 configure 脚本(参见 Bash安装)。你可能需要提供 --srcdir=PATH 参数来告诉 configure 源文件的位置。configure 会自动在其所在目录以及...

如果你必须使用不支持 VPATH 变量的 make,可以在源代码目录中一次为一种架构编译 Bash。安装完一种架构的 Bash 后,在为另一种架构重新配置之前,使用 'make distclean'。

另外,如果你的系统支持符号链接,你可以使用 support/mkclone 脚本创建一个构建树,该树中的每个文件都通过符号链接返回到源代码目录。下面是一个示例,它从源目录 /usr/gnu/src/bash-2.0 在当前目录中创建一个构建目录:

bash 复制代码
bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .

mkclone 脚本需要 Bash,因此你必须至少为一种架构构建过 Bash,才能为其他架构创建构建目录。

10.4 Installation Names

默认情况下,'make install' 会安装到 /usr/local/bin、/usr/local/man 等目录;也就是说,安装前缀默认是 /usr/local。你可以通过给 configure 提供选项 --prefix=PATH 来指定一个不同于 /usr/local 的安装前缀,或者在运行 'make install' 时为 make 变量 prefix 指定一个值(例如,'make install prefix=PATH')。prefix 变量为 exec_prefix 及其他在安装 Bash 时使用的变量提供默认值。

你可以为特定架构文件和与架构无关的文件指定不同的安装前缀。如果你给 configure 提供选项 --exec-prefix=PATH,'make install' 将使用 PATH 作为安装程序和库的前缀。文档和其他数据文件仍然使用常规前缀。

如果你想在单次安装过程中更改安装位置,可以将这些变量作为参数传递给 make:'make install exec_prefix=/' 将把 bash 和 bashbug 安装到 /bin,而不是默认的 /usr/local/bin。

如果你想在不更改系统任何内容的情况下查看 Bash 将安装哪些文件以及安装到哪里,可以将变量 DESTDIR 作为参数传递给 make。其值应为你希望用作示例安装树根目录的绝对路径。例如,

bash 复制代码
mkdir /fs1/bash-install
make install DESTDIR=/fs1/bash-install

将会把 bash 安装到 /fs1/bash-install/usr/local/bin/bash,文档安装到 /fs1/bash-install/usr/local/share 内的各个目录,可加载示例内建命令安装到 /fs1/bash-install/usr/local/lib/bash,等等。你可以使用常规的 exec_prefix 和 prefix 变量来修改 DESTDIR 下的目录路径。

GNU Makefile 标准提供了这些变量及其作用的更完整说明。

10.5 Specifying the System Type

有些功能 configure 可能无法自动识别,需要根据 Bash 将运行的主机类型来确定。通常 configure 可以识别,但如果它提示无法猜测主机类型,可以使用 --host=TYPE 选项。'TYPE' 可以是系统类型的简称,例如 'sun4',也可以是一个包含三部分的标准名称:'CPU-COMPANY-SYSTEM'(例如 'i386-unknown-freebsd4.2')。

有关每个字段可能的取值,请参见文件 support/config.sub。

bash 复制代码
# cpu-company-system format
$ echo $MACHTYPE
x86_64-redhat-linux-gnu

10.6 Sharing Defaults

如果你想为配置脚本设置默认值以便共享,你可以创建一个名为 config.site 的站点 shell 脚本,为变量如 CC、cache_file 和 prefix 提供默认值。configure 会首先查找 PREFIX/share/config.site(如果存在),然后查找 PREFIX/etc/config.site(如果存在)。或者,你可以将 CONFIG_SITE 环境变量设置为该站点脚本的位置。提醒一下:Bash 的 configure 会查找站点脚本,但并非所有的 configure 脚本都会这样做。

10.7 Operation Controls

configure 识别以下选项来控制其运行方式。

--cache-file=file

使用并保存测试结果到文件 file 而不是 ./config.cache。将 file 设置为 /dev/null 可以禁用缓存,用于调试 configure。

--help

打印 configure 选项的摘要,并退出。

--quiet
--silent
-q

不打印正在进行哪些检查的信息。

--srcdir=dir

在目录 dir 中查找 Bash 源代码。通常 configure 可以自动确定该目录。

--version

打印用于生成 configure 脚本的 Autoconf 版本,并退出。

configure 还接受一些其他不常用的标准选项。'configure --help' 打印完整列表。

10.8 Optional Features

Bash 的配置有许多 --enable-feature 选项,其中 feature 表示 Bash 的一个可选部分。此外,还有几个 --with-package 选项,其中 package 类似于 'bash-malloc' 或 'afs'。要关闭某个包的默认使用,请使用 --without-package。要配置 Bash 而不启用默认启用的功能,请使用 --disable-feature。

以下是 Bash 配置所识别的 --enable- 和 --with- 选项的完整列表。

--with-afs

定义是否使用来自 Transarc 的 Andrew 文件系统。

--with-bash-malloc

在 lib/malloc 目录中使用 Bash 版本的 malloc。这个 malloc 与 GNU libc 中的 malloc 不同,而是最初源自 4.2 BSD malloc 的自定义版本。这个 malloc 非常快,但在每次分配时会浪费一些空间,不过它使用几种技术来最小化浪费。此选项默认启用。NOTES 文件列出了应关闭此选项的系统,配置过程会自动为一些系统禁用此选项。

--with-curses

使用 curses 库而不是 termcap 库。configure 通常会自动选择此项,因为大多数系统在 curses 库中包含了 termcap 函数。

--with-gnu-malloc

--with-bash-malloc 的同义词。

--with-installed-readline[=PREFIX]

定义此选项以使 Bash 链接到本地安装的 Readline 版本,而不是 lib/readline 中的版本。此选项仅适用于 Readline 5.0 及更高版本。如果 PREFIX 为 yes 或未提供,configure 会使用 make 变量 includedir 和 libdir 的值(默认情况下是 prefix 的子目录)来查找已安装的 Readline 版本,如果它不在标准系统的包含和库目录中。如果 PREFIX 为 no,Bash 会链接 lib/readline 中的版本。如果 PREFIX 设置为其他值,configure 会将其视为目录路径,并在该目录的子目录中查找已安装的 Readline 版本(包含文件在 PREFIX/include,库文件在 PREFIX/lib)。Bash 的默认设置是链接构建目录的 lib/readline 子目录中构建的静态库。

--with-libintl-prefix[=PREFIX]

定义此选项以使 Bash 链接到本地安装的 libintl 库版本,而不是 lib/intl 中的版本。

--with-libiconv-prefix[=PREFIX]

定义此选项以使 Bash 在 PREFIX 中查找 libiconv,而不是在标准系统位置。Bash 发行版中不包含该库。

--enable-minimal-config

此选项生成一个功能最少的 shell,更接近历史上的 Bourne shell

有几个 --enable- 选项会改变 Bash 的编译、链接和安装方式,而不是改变运行时功能。

--enable-largefile

如果操作系统需要特殊的编译器选项来构建可以访问大文件的程序,则启用对大文件的支持。如果操作系统提供大文件支持,则默认启用此选项。

--enable-profiling

构建一个 Bash 二进制文件,每次执行时都会生成可供 gprof 处理的性能分析信息。

--enable-separate-helpfiles

使用外部文件来显示 help 内置命令的文档,而不是将文本存储在内部。

--enable-static-link

如果使用 gcc,则使 Bash 静态链接。这可以用于构建一个版本作为 root 的 shell 使用。

'minimal-config' 选项可以用来禁用以下所有选项,但它会首先被处理,因此可以使用 'enable-feature' 单独启用某些选项。

除 'alt-array-implementation'、'disabled-builtins'、'direxpand-default'、'strict-posix-default' 和 'xpg-echo-default' 之外,以下所有选项默认都是启用的,除非操作系统不提供必要的支持。

--enable-alias

允许别名展开,并包含 alias 和 unalias 内建命令(参见 别名)。

--enable-alt-array-implementation

使用数组的替代实现来构建 Bash(参见 数组),这种实现提供更快的访问速度,但代价是使用更多内存(有时会高出许多倍,取决于数组的稀疏程度)。

--enable-arith-for-command

支持 for 命令的替代形式,该形式行为类似 C 语言的 for 语句(参见 循环结构)。

--enable-array-variables

支持一维数组类型的 shell 变量(参见 数组)。

--enable-bang-history

支持类似 csh 的历史替换(参见 历史扩展)。

--enable-bash-source-fullpath-default

设置The Shopt Builtin中描述的 bash_source_fullpath shell 选项的默认值为启用。这控制了如何将文件名分配给 BASH_SOURCE 数组变量。

--enable-brace-expansion

包含类似 csh 的大括号扩展(b{a,b}c → bac bbc)。请参阅 Brace Expansion 以获得完整描述。

--enable-casemod-attributes

在 declare 内建命令和赋值语句中包含对大小写修改属性的支持。例如,具有大写属性的变量在赋值时其值将被转换为大写。

--enable-casemod-expansion

包含对大小写修改字扩展的支持。

--enable-command-timing

包含对识别 time 作为保留字的支持,并显示 time 后续管道的时间统计信息(参见 管道 )。这允许对管道、Shell 复合命令、Shell 内建命令及 Shell 函数进行计时,而外部命令无法轻松实现。

--enable-cond-command

包括对 [[ 条件命令 的支持。(参见条件结构)。

--enable-cond-regexp

包括使用 '=~' 二元运算符在 [[ 条件命令 中匹配 POSIX 正则表达式的支持。(参见条件结构)。

--enable-coprocesses

包括对协同进程和 coproc 保留字的支持。(参见 管道 )。

--enable-debugger

包括对 Bash 调试器的支持(单独分发)。

--enable-dev-fd-stat-broken

如果在 /dev/fd/N 上调用 stat 返回的结果与在文件描述符 N 上调用 fstat 不同,请使用此选项以启用解决方法。这对测试文件属性的条件命令有影响。

--enable-directory-stack

包括对类似 csh 的目录堆栈以及内建命令 pushd、popd 和 dirs 的支持(参见目录堆栈)。

--enable-disabled-builtins

允许即使在使用 'enable -n xxx' 禁用 xxx 后,也可以通过 'builtin xxx' 调用内置命令。有关内置命令和 enable 内置命令的详细信息,请参见 Bash 内置命令。

--enable-dparen-arithmetic

包括对 ((...)) 命令的支持(参见条件构造)。

--enable-extended-glob

包括对上述模式匹配下描述的扩展模式匹配功能的支持。

--enable-extended-glob-default

The Shopt Builtin 中描述的 extglob shell 选项的默认值设置为启用。

--enable-function-import

包括支持从环境中导入另一个 shell 实例导出的函数定义。此选项默认启用。

--enable-glob-asciiranges-default

设置上文在"Shopt 内置命令"下描述的 globasciiranges shell 选项的默认值为启用。这会控制在模式匹配方括号表达式中使用字符范围时的行为。

--enable-help-builtin

包含 help 内置命令,它可以显示关于 shell 内置命令和变量的帮助(参见 Bash 内置命令)。

--enable-history

包含命令历史记录以及 fc 和 history 内置命令(参见 Bash 历史记录功能)。

--enable-job-control

如果操作系统支持,这将启用作业控制功能(参见作业控制)。

--enable-multibyte

如果操作系统提供必要的支持,这将启用多字节字符的支持。

--enable-net-redirections

这启用了对形如 /dev/tcp/host/port 和 /dev/udp/host/port 的文件名在重定向时的特殊处理(参见重定向)。

--enable-process-substitution

如果操作系统提供必要支持,则启用进程替换(参见进程替换)。

--enable-progcomp

启用可编程补全功能(参见可编程补全)。如果未启用 Readline,此选项无效。

--enable-prompt-string-decoding

PS0、PS1、PS2 和 PS4 提示符字符串中启用对若干反斜杠转义字符的解释。有关完整的提示符字符串转义序列列表,请参见控制提示符

--enable-readline

包含对 Bash 版本 Readline 库的命令行编辑和历史记录支持(参见命令行编辑)。

--enable-restricted

包含对受限外壳的支持。如果启用此功能,Bash在调用rbash时会进入受限模式。关于受限模式的描述,请参见受限Shell

--enable-select

包含选择复合词命令,该命令允许生成简单菜单(参见条件构造)。

--enable-single-help-strings

将帮助内置显示的文本作为每个帮助主题的单一字符串存储。这有助于将文本翻译成不同语言。如果你的编译器无法处理非常长的字符串文字,可能需要禁用这个功能。

--enable-strict-posix-default

默认让 Bash 符合 POSIX 标准(参见 Bash 和 POSIX)。

--enable-translatable-strings

启用对 $"字符串"可翻译字符串的支持(参见Locale-Specific Translation)。

--enable-usg-echo-default

这是 --enable-xpg-echo-default 的同义词。

--enable-xpg-echo-default

使 echo 内建命令默认展开反斜杠转义字符,而无需使用 -e 选项。这将 xpg_echo shell 选项的默认值设置为开启,使 Bash 的 echo 行为更类似于Single Unix Specification 第 3 版中指定的版本。有关 echo 识别的转义序列的说明,请参见 Bash 内建命令

文件 config-top.h 包含一些 C 预处理器的 '#define' 语句,用于配置无法通过 configure 设置的选项。其中一些不建议修改;如果修改,请注意可能带来的后果。有关每个定义的具体影响,请阅读其注释说明。

相关推荐
量子炒饭大师17 小时前
【Linux系统编程】——【自动化构建-make/Makefile】拒绝手动编译!构建你的赛博代码加工厂,重塑逻辑矩阵效率极限
linux·运维·自动化·makefile·make·自动化构建
IMPYLH19 小时前
Linux 的 unlink 命令
linux·运维·服务器·bash
Irene19912 天前
Shell 相关基础入门,在 Ubuntu 与 CentOS Shell 中的语法差异总结(bash、dash、sh)
shell
小肝一下2 天前
5. 基础IO
android·linux·shell·基础io·操作系统底层·伊涅夫·伊雷娜
YuanDaima20483 天前
Docker 工程化安装与核心命令实战
运维·人工智能·docker·微服务·容器·bash
红茶要加冰3 天前
七、正则表达式
linux·运维·正则表达式·shell
lifewange4 天前
WSL安装问题解决
shell
AdCj34 天前
放弃第三方框架,用系统自带工具玩转 Shell 测试
shell·测试
红茶要加冰4 天前
九、文本处理三剑客——sed
linux·运维·服务器·正则表达式·shell
山岚的运维笔记4 天前
Bash 专业人员笔记 -- 第 11 章:`true`、`false` 和 `:` 命令
linux·运维·服务器·开发语言·笔记·学习·bash