10.Bash的安装
本节提供了在 Bash支持的不同系统上的基本安装指导。
本版本支持 GNU操作系统,几乎每个 UNIX版本,以及几个非 UNIX 系统,例如 BeOS 和 Interix。
还有针对 MS-DOS、OS/2、Windows 等系统的独 立移植版本。
10.1 基本安装
下面介绍 Bash的安装步骤。编译 Bash最简单的方法是:
1)切换到包含源文件的目录并输入 ./configure 以便在系统中配置 Bash。如果在老版本的 System V上使用 csh,则需要输入 sh ./configure 以防止 csh 自己去执行配置。配置要花一点时间。运行中它会输出一些信息告诉用户它正在检查什么功能。
2)输入 make 来编译 Bash和 bashbug。bashbug是一个错误报告的脚本。
3)可选的,输入 make tests 来运行 Bash的测试用例。
4)输入 make install 来安装 bash 和 bashbug。这一步还会安装帮助手册和Info文件。
配置脚本会试图猜测编译时所需的各个和系统相关的变量值。
这些值用来在包的每个目录 (即顶级目录、builtins、doc、support,还有 lib 下面的每个目录,以及其它几个目录)下面生成 Makefile 文件。
它还会生成一个包含系统相关定义的config.h 文件。
朂后,它会生成一个叫 config.status 的脚本,以后可以用它来重新生成当前的配置;还有一个叫 config.log 的文件来存放编译时的输出(主要用于调度配置脚本)。
有时候 config.cache 文件包含一些不想要的结果;这时可以删除或修改它。
在Bash目录的命令提示符下,可以输入下面的命令以获得配置脚本所接受的更多选项和参数:
bash$ ./configure --help
如果想在编译 Bash时做一些额外配置,则需要了解配置脚本是怎么决定是否这样配置的,并把代码不同部分以及步骤发送到bash-maintainers@gnu.org以便在下次发布时包含这些改动。
configure.in 文件是一个叫 Autoconf的程序用来生成配置脚本的。
如果修改配置,或者使用新版本的Autoconf重新生成配置,只需要这个文件就行了。这时要确保使用 2.50 或更高版本的 Autoconf。
可以用 make clean 在源文件目录删除二进制程序文件和目标文件。
如果还要删除配置脚本生成的文件(以便为不同的电脑编译 Bash),则输入 make distclean。
10.2 编译器和选项
有些系统需要在编译和连接时用一些不能被配置脚本识别的选项。
可以在环境中为配置脚本设置一些变量的初始值。
如果使用与波恩 shell兼容的程序,则可以在命令行中这样写:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
如果系统中有 env 程序,则可以这样写:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
如果有GCC,则配置过程中便用它来编译 Bash。
10.3 跨平台编译
可以把目标文件放在各个系统自己的目录中以便同时为多种类型的电脑编译 Bash。
为此,必须使用支持VPATH 变量的 make 版本,例如 GNU make。
切换到要存放目标文件和可执行文件的目录并运行源文件目录中的配置脚本。
这时可能要指定 --srcdir=PATH 参数告诉配置脚本源文件的位置。
配置脚本会自动在其所在的目录和 .. 中寻找源文件。
如果一定要使用不支持 VPATH 变量的 make,则可以在源文件目录中每次只为一个系统编译 Bash。
为某个系统安装好 Bash后要运行 make distclean 才能再为其它系统编译。
或者,如果系统支持符号链接, 则可以使用 support/mkclone 脚本来生成编译树,其中包含指向源目录每个文件的链接。
下面的例子在当前目录中使用 /usr/gnu/src/bash 目录里的源文件来生成编译树:
bash /usr/gnu/src/bash/support/mkclone -s /usr/gnu/src/bash .
mkclone 脚本要 Bash才能运行,所以必须已经在至少一个系统上编译了 Bash才能为其它系统生成编译树。
10.4 安装路径
默认情况下,make install 会在 /usr/local/bin、/usr/local/man 等目录下安装。
可以使用配置选项 --prefix=PATH 来指定 /usr/local 以外的安装根目录,或者在运行 make install 时给 make 的DESTDIR 变量指定不同的值。
可以为系统相关和系统无关的文件分别指定安装根目录。
如果指定了配置选项 --exec-prefix=PATH,则 make install 会使用 PATH 作为安装程序和库文件的根目录;而文档和其它数据文件仍安装在常规的地方。
10.5 选择系统类型
可能配置脚本不能自动发现某些系统特性,而是由要运行 Bash的主机类型来决定。
配置脚本通常会发现这些特性;如果它没有并打印一条信息说它不能发现系统类型,则需要 --host=类型 选项。
类型可以是系统类型的简称,例如 sun4,或者是包含三个字段的典型称呼“CPU-COMPANY-SYSTEM”,如i386-unknow-freebsd4.2。
关于每个字段的可能取值,请参考 support/config.sub 文件。
10.6 默认设置的共享
如果要让配置共享一些默认值,可以创建一个 config.site 的全局 shell脚本,并在其中设置诸如 CC、cache_file、prefix 等变量的默认值。
配置脚本会依次查找 PREFIX/share/config.site 和PREFIX/etc/config.site 文件。
也可以用环境变量 CONFIG_SITE 来指定全局脚本的位置。
注意,Bash的配置脚本会寻找全局脚本,但不是每个其它配置脚本也都这么做。
10.7 控制配置脚本
配置脚本会识别下列控制选项。
--cache-file=文件 用文件而不是 ./config.cache 来保存测试结果。为了测试配置脚本,可以把它设为 /dev/null 以禁止缓存。
--help 打印配置选项的总结后退出。
--quiet
--silent 不显示正在检查的目标。
-q
--srcdir=目录 在目录中寻找 Bash的源文件。配置脚本通常会自动找到这个目录。
--version 打印用来生成当前配置脚本的 Autoconf的版本信息,然后退出。
还有其它不常使用的以及用作模板的选项。可以用 ./configure --help 列出全部选项。
10.8 配置选项
Bash的配置脚本有一些 --enable-feature 选项,其中的 feature 是 Bash中可选的功能。
还有一些 --with-package 选项,其中的 package 是诸如 bash-malloc 或 purify 的模块。
如果想禁用一些默认的模块,可以用 --without-package;如果想禁用一些默认就打开的功能,可以用 --disable-feature。
下面是 Bash配置脚本能识别的所有 --enable- 和 --with- 选项。
--with-afs 如果使用 Transarc 上面的安德鲁文件系统 (AFS)就打开这个选项。
--with-bash-malloc 使用 lib/malloc 目录下 Bash版本的 malloc。它和 GNU LIBC里面的 malloc是不同的,而是直接继承 BSD4.2 的一个老版本。
这个版本更快,但每次分配内在时都会浪费一些空间。这个选项默认是打开的。
NOTES 文件列出了一些应该关闭这个选项的系统;在某些系统中,配置脚本会自动关闭这个选项。
--with-gnu-malloc 与 --with-bash-malloc 同义。
--with-curses 使用 curses 库而不是 termcap 库。如果系统中没有合适的或完整的 termcap 数据库, 就应该使用它。
--with-installed-readline[=前缀] 定义这个选项会让 Bash和本地安装的Readline库连接,而不是 lib/readline。只有使用 Readline5.0 或更高版本时才有用。
如果没有指定 PREFIX,并且Readline没有安装在标准的头文件和库目录中,配置脚本会使用 make 的变量 includedir 和 libdir 作为默认的子目录和根目录来搜索Readline的安装路径。
如果 PREFIX 是 no,Bash就和lib/readline 中的那个版本连接。
如果 PREFIX 设为其它值,则配置脚本会把它当作一个路径,并在这个目录和其子目录中搜索安装好的Readline(在 PREFIX/include 中搜索头文件,在 PREFIX/lib中搜索库文件)。
--with-purify 定义这个选项可以使用 Rational 软件来进行内存分配检查。
--enable-minimal-config 生成一个最简小的 shell,和历史上的波恩 shell很相近。 有一些 --enable- 选项能控制怎么编译和连接 Bash,而不是改变它运行时的功能。
--enable-largefile 支持大文件;如果操作系统需要特殊的编译器选项才能生成支持大文件在程序就用这个选项。如果操作系统支持大文件,这个选项默认是打开的。
--enable-profiling 这个选项会生成一个支持性能分析的 Bash可执行文件;性能分析信息可以在每次执行时由 gprof 处理。
--enable-static-link 如果使用 gcc, 这个选项可以静态的连接 Bash;它可以作为 root 的shell。
可以用 minimal-config 即最小选项来禁用下面所有的选项;这个选项将会优先处理,所以可以用--enable-feature 来打开个别选项。
除了 disabled-builtins 和 xpg-echo-default,下面的所有选项默认都是打开的,除非系统不支持。
--enable-alias 允许扩展别名并包含内部命令 alias 和 unalias
--enable-arith-for-command 支持另外C语言形式的 for 命令。
--enable-array-variables 支持一维数组变量。
--enable-bang-history 支持类似于 csh 的历史替换。
--enable-brace-expansion 支持类似于 csh 的大括号扩展,例如 b{a,b}c --> bac bbc。
--enable-casemod-attributes 允许内部命令 declare 以及在赋值时更改大小写的属性。例如,具有大写属性的变量在接受赋值时会把值转换成大写。
--enable-casemod-expansion 支持更改大小写的单词扩展。
--enable-command-timing 支持把 time 识别为关键字并显示其后的管道的时间统计信息。这样可以统计管道以及内部命令和函数的执行时间。
--enable-cond-command 支持条件测试命令。
--enable-cond-regexp 支持在条件测试命令 [[ 的双目运算符 =~ 后使用 POSIX 正则表达式进行匹配。
--enable-coprocesses 支持协同进程和保留字 coproc。
--enable-debugger 支持 Bash调度器。
--enable-directory-stack 支持类似于 csh 的目录栈以及内部命令 pushd、popd、dirs。
--enable-disabled-builtins 支持通过 builtin XXX 来启用一个内部命令,即使这个内部命令已经用enable -n XXX 禁用了。
--enable-dparen-arithmetic 支持 ((...)) 命令 。
--enable-extended-glob 支持扩展的模式匹配。
--enable-help-builtin 支持内部命令 help,它能显示 shell内部命令和变量的帮助信息。
--enable-history 支持命令历史和内部命令 fc 与 history。
--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 启用 $PS1、$PS2、$PS3、$PS4 提示符字符串中对一些转义字符 的解析。关于提示符字符串中的全部转义字符,请参见6.9提示符的控制 。
--enable-readline 通过 Bash版本的 Readline库支持命令行编辑和历史。
--enable-restricted 支持受限制的shell。如果启用它,则用 rbash 来启动 Bash时会进入受限模式。 关于受限模式,请参见6.10受限制的shell。
--enable-select 支持内部命令 select,它可以生成简单的菜单。
--enable-separate-helpfiles 把内部命令 help 显示的帮助文档存放在外部文件中,而不是存放在命令内部。
--enable-single-help-strings 把内部命令 help 显示的帮助文档作为各个帮助主题的单个字符串存放。这样有助于把这些文本翻译成不同语言。如果电脑不能处理很长的文本字符串,可以禁用这个选项。
--enable-strict-posix-default 使 Bash默认遵循 POSIX。
--enable-usg-echo-default 与 --enable-xpg-echo-default 同义。
--enable-xpg-echo-default 让内部命令 echo 默认就扩展由斜杠默认的字符,而不需要“-e”选项。
这个选项会把 shell xpg_echo 选项的默认值设为 on,从而使得 Bash的 echo 表现得更像是 UNIX 统一规范第三版中指定的那个版本。
关于 echo 所能识别的转义序列,请参见4.2Bash的内部命令echo。
config-top.h 文件中包含了那些不能由配置脚本设置的选项,它们是 C预处理的 #define 声明。
这些选项中有些是不应该改的;如要修改,请当心其后果。
关于这些定义的作用,请阅读与其相关的注释。