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 设置的选项。其中一些不建议修改;如果修改,请注意可能带来的后果。有关每个定义的具体影响,请阅读其注释说明。

相关推荐
dingdingfish15 小时前
Bash学习 - 第8章:Command Line Editing,第3节:Readline Init File
bash·init·bind·readline
dingdingfish1 天前
Bash学习 - 第8章:Command Line Editing,第6-8节:Programmable Completion
bash·shell·completion·complete·compgen·compopt
dingdingfish2 天前
Bash学习 - 第8章:Command Line Editing,第4-5节:Bindable Readline Commands
bash·emacs·vi·bind·readline
香芋Yu2 天前
【从零构建AI Code终端系统】02 -- Bash 工具:一切能力的基础
开发语言·bash·agent·claude
白云偷星子2 天前
RHCSA笔记3
shell
dingdingfish3 天前
Bash学习 - 第7章:Job Control
bash·shell·wait·job
dingdingfish3 天前
Bash学习 - 第8章:Command Line Editing,第1-2节:Intro & Readline Interaction
bash·shell·readline
only_Klein3 天前
Shell 三剑客
shell·sed·grep·awk
dingdingfish4 天前
Bash学习 - 第6章:Bash Features,第11节:Bash and POSIX
bash·posix