本书的前十章介绍了bash的几乎全部内容,从文件系统介绍和命令行编辑到使用shell中鲜为人知的特性编写shell脚本和函数都已介绍完毕。但如果你拥有的是一个旧的bash版本,并且想要使用本书介绍的新特性时该怎么办(最糟的是你根本没有bash)呢?
本章介绍如何得到bash的最新版本,即如何在你的系统上安装它。我们会讨论此过程中遇到的潜在问题。我们还会介绍如何使用bash的一些例子以及向bash管理员报告故障。
**获得bash
如果你直接连接到Internet,则获得bash没有问题;否则就要多做些工作。
可从许多匿名FTP站点获得bash。下面列出了一些(包括主机名、IP地址和目录名):
prep.ai.mit.edu (18.159.0.42) /pub/gnu
sunsite.unc.edu (152.2.254.81) /pub/gnu
plaza.aarnet.edu.au (139.130.23.2) /gnu
ftp.isy.liu.se (130.236.20.12) /pub/gnu
unix.hensa.ac.uk (129.12.200.129) /mirrors/gnu
prep.ai.mit.edu是官方GNU站点,总保持bash的最新更新版本。列表中其他站点一般都与该官方站点一致,因此除非做了重要修改,否则他们也应是最新的版本。要减少GNU站点上的负载,最好从其他站点上获得bash。
如果你从没有使用过匿名ftp,这里给出一个例子。下面的示例会话以粗体显示你键入的内容,以斜体显示注释:
$ ftp unix.hensa.ac.uk
Connected to sesame.hensa.ac.uk.
220 sesame FTP server (Version wu-2.4(20) Fri Jul 28 15:46 GMT 1995) ready.
Name (unix.hensa.ac.uk:cam): anonymous
331 Guest login ok, send your complete e-mail address as password.
Password: alice@wonderland.oreilly.com (use your login name and host here)
230- *********************************************************************
230-
230- Welcome to HENSA
230-
230- the Higher Education National Software Archive
230- at the University of Kent at Canterbury
230- funded by JISC
230-
230- HENSA Unix maintains copies of electronic archives from all
230- over the world. Over 40 archives are currently available,
230- providing access to a wide range of material, including
230- software, documentation, bibliographic and multimedia collections.
230- To access the mirrors, change directory to mirrors.
.
.
.
230-Please read the file README
230- it was last modified on Mon Apr 7 14:25:03 1997 - 121 days ago
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /mirrors/gnu
250-Please read the file README
250- it was last modified on Mon Jul 8 23:00:00 1996 - 393 days ago
250-Please read the file README-about-.diff-files
250- it was last modified on Thu Mar 20 14:08:00 1997 - 139 days ago
250-Please read the file README-about-.gz-files
250- it was last modified on Tue Jul 9 16:18:00 1996 - 392 days ago
250 CWD command successful.
ftp> binary (you must specify binary transfer for compressed files)
200 Type set to I.
ftp> get bash-2.01.tar.gz
local: bash-2.01.tar.gz remote: bash-2.01.tar.gz
200 PORT command successful.
150 Opening BINARY mode data connection for bash-2.01.tar.gz (1342563 bytes).
226 Transfer complete.
1342563 bytes received in 556 secs (2.4 Kbytes/sec)
.
. (repeat this step for each file that you want)
.
ftp> quit
221 Goodbye.
$
你还可以通过FTPMAIL、BITFTP和UUCP检索这些文件。要找到使用这些方法的方式,请参考附录五。
如果这些方法失败,你还可以直接向自由软件基金会定购bash的磁带或CD-ROM:
The Free Software Foundation (FSF)
675 Massachusetts Avenue
Cambridge MA, 02139
email: gnu@prep.ai.mit.edu
phone: (617) 876-3296
**解开压缩包
通过上述方法获得压缩文件后,需要将之解开并安装在你的系统上。可以在任意位置进行解压缩——这里假定你是在你的主目录上。只有特权用户才能在系统上安装它。如果你不是具有root访问权限的系统管理员,仍可以编译并使用bash,只是不能将之安装为全系统范围内的实用程序。要做的第一步操作是通过键入gunzip bash-2.01.tar.gz解开压缩文件。然后需要键入tar -xf bash-2.01.tar恢复压缩文件。-xf意思是“抽取指定压缩文件中的内容”。结果会在你的主目录下创建一个目录bash-2.01。
该包包含了编译bash需要的所有源码以及大量的文档和例子。在本章其余部分我们会介绍这些内容以及如何执行bash。
**压缩包中的内容
bash压缩包包含主目录(针对当前版本的bash-2.01)、文件集以及子目录。这些文件中你应该首先检验的是:
·MANIFEST,包中所有文件和目录的列表。
·COPYING,bash的GNU Copyleft版权声明。
·NEWS,在上一版bash上添加的故障修复和新特性的列表。
·README,编译bash的简短介绍和指示。
还需要知道以下两个目录:
·doc,各种格式的与bash相关的信息。
·examples,启动文件、脚本和函数的例子。
压缩包中的其他文件和目录大多数都是在连编过程中所需要的。除非你要进行shell的内部操作,否则它们与你无关。
**文档
doc目录包含许多值得一读的文章。
实际上应把bash的帮助页打印出来,这样你就可以结合本书内容使用它。README文件给出了对这些文件的简短总结。
最常用到的文档是帮助页(bash.1)。该文件格式为troff——它常被帮助页面使用。在读它之前可以用文本格式化器nroff先进行处理并将输出结果导出到页面实用程序:nroff -man bash.1 | more执行此功能。还可以将其导出到打印机(lp)打印。它总结了bash版本的所有功能,是你能得到的最新参考资料。安装了包文件后,也可通过man得到该文档。但有时做硬拷贝更好些,这样你就可以对其编写笔记。
另外,FAQ是对频繁问题的应答文档,readline.3是readline工具的帮助页面。article.ms是一篇在Linux Journal中关于shell的文章,作者是当前bash管理员,Chet Ramey。
**配置和构建bash
要编译bash是很容易的。你可以键入configure,然后键入make就可以了。bash的configure脚本试图找出你是否拥有各种实用程序和C库函数,以及它们在系统中的位置。然后它把相关信息保存在文件config.h中,还将创建文件config.status,这是一个用来重新创建当前配置信息的脚本。当configure运行时,它将打印出其搜索到的信息以及它们的位置。
configure脚本还设置了安装bash的位置,默认为/usr/local(可执行程序在/usr/local/bin,帮助页面在/usr/local/man等)。如果你不是特权用户又想要把它安装在你的主目录,或是希望在其他位置安装bash,就需要指定配置路径。可通过--exec-prefix选项实现。例如:
$ configure —exec-prefix /usr
指定了将bash文件放在/usr目录下。
配置完成后,键入make,连编bash可执行程序。同时会生成一个称为bashbug的脚本,它允许你以bash管理员要求的格式报告故障。本章后面会介绍如何使用它。
一旦连编过程完成,可以通过键入./bash查看bash的执行情况。如果它不执行,请参见本章后面的“潜在问题”一节。
要安装bash,键入make install。这样就创建了所有必须的目录(bin、info、man和其子目录),并把文件复制到这些目录中。
如果要将bash安装到你的主目录,应确保在PATH中加入你自己的bin路径,以及在MANPATH中加入自己的man路径。
bash预先使几乎所有特性可用,但可通过使用configure的--enable-feature和--disable-feature命令行选项指定所需内容来定制你的版本。
表11-1列出了可配置的特性以及这些特性内容的简单说明。
表11-1 可配置特性
特性 说明
alias 支持别名
array-variables 支持一维数组
bang-history 类C shell历史扩展和编辑
brace-expansion 大括号扩展
command-timing 支持time命令
directory-stack 支持pushd、popd和dirs目录操作命令
disabled-builtins 是否可以使用builtin命令运行内置命令,即使使用enable -n屏蔽了它
dparen-arithmetic 支持((...))
help-builtin 支持help内置命令
history 通过fc和history命令实现的历史命令
job-control 如果操作系统支持fg、bg和jobs,通过它们进行作业控制
process-substitution 如果操作系统支持,是否允许进程替换
prompt-string-decoding 是否允许PS1,PS2,PS3和PS4中的反斜线转义字符
readline readline编辑和历史功能
restricted 支持受限shell、shell的-r选项和rbash
select select结构
usg-echo-default echo -e是否为echo的默认
选项disabled-builtins和usg-echo-default被默认屏蔽,其他默认为可用。
可通过修改文件config.h.top启用和禁用许多其他的shell特性。关于该文件和配置bash的详细信息请参见INSTALL。
最后,要清除源目录,并删除所有目标文件和可执行文件,键入make clean即可。首先要确保运行了make install,否则必须从头安装。
**测试bash
对新建立的bash版本要运行许多测试以观察其运行的正确性。测试是来自shell早期版本中问题的脚本。对早期版本运行这些测试不应该产生任何错误。
要运行测试,可以在主bash目录下键入make tests。这样首先会显示每个测试的名字、同时还有一些警告信息。然后运行它。成功测试没有输出结果(除非是在警告信息中注明)。
如果测试失败,会显示一个给出预计结果和实际发生结果之间不同之处的列表。这时应该使用bash维护程序生成故障报告文件。本章的“报告故障”一节介绍了实现的方式。
**潜在问题
虽然bash已被安装在大量的不同机器和操作系统上,但偶尔也会出现问题。通常问题不会很严重,仔细研究一下就可以解决。
如果bash不编译,要做的第一件事是检查configure是否正确猜出了机器和操作系统信息。然后检查文件NOTES,它包含了一些特定的UNIX系统的某些信息。还要看看INSTALL,它提供了如何向configure给出特定编译指令的额外信息。
**将bash安装为一个登录shell
安装bash并确保其工作正确后,下一步是使其成为登录shell。有两种实现方式。
每个用户在登录到自己的账户后都可以使用chsh(改变shell)命令。chsh向用户请求密码,并显示可以选择的shell列表。一旦选择了一个shell,chsh就改变/etc/passwd中相应的记录。安全起见,chsh只允许你改变成文件/etc/shells中存在的shell(如果/etc/shells不存在,chsh请求shell的路径名)。
改变登录shell的另一种方式是直接编结口令文件。在大多数系统上/etc/passwd文件有下列形式:
cam:pK1Z9BCJbzCrBNrkjRUdUiTtFOh/:501:100:Cameron Newham:/home/cam:/bin/bash
cc:kfDKDjfkeDJKJySFgJFWErrElpe/:502:100:Cheshire Cat:/home/cc:/bin/bash
作为特权用户,你可以将口令文件中行中的最后一个域编辑为你所选择的shell的路径名。
如果你不是特权用户并且chsh不能正常运行,你仍可以使bash成为你的登录shell。方法是在当前shell的启动文件中使用exec将当前shell替换为bash。
如果当前shell类似于sh(例如ksh),则可在.profile中加入下列行:
[ -f /pathname/bash ] && exec /pathname/bash —login
这里pathname为bash可执行文件的路径。
还必须创建一个称为.bash_profile的空文件。该文件的存在阻止bash读取.profile以及再次执行exec——这样就会进入一个无限循环。bash所需的任何初始化代码都被放在.bash_profile中。
如果当前shell类似于csh(例如,tcsh),则更加容易。只需向.login加入下列行:
if ( -f /pathname/bash ) exec /pathname/bash —login
这里pathname为bash可执行文件的路径。
**例子
bash压缩包还包括一个例子目录,该目录包含一些脚本、函数和启动文件例子的子目录。
在startup-files中的启动文件中有许多示例,提供了许多可以加到启动文件中的例子。特别是,bash_aliases给出了许多有用的别名。记住,如果你大量的复制这些文件,必须编辑它们以符合当前系统,因为许多路径都是不同的。可以改变这些文件以满足你的需求。详细信息请参见第三章。
函数目录包含用户可能会用到的带有函数定义的20个文件。其中有:
·basename,basename实用程序,某些系统没有。
·dirfuncs,目录操作工能。
·dirname,dirname实用程序,某些系统没有。
·whatis,第10版Bourne shell whatis内置命令的实现。
·whence,几乎是Korn shell whence内置命令的精确复制。
如果你曾使用过Korn shell,那么对你而言特别有用的是kshenv。它包含某些常见的Korn功能,如whence,print和两参数cd命令的函数定义。
scripts目录包含bash脚本的4个例子。两个最大的脚本例子使用shell脚本执行了复杂功能。第一个是一个冒险游戏解释器(相当好玩),第二个是一个C shell解释器。其他脚本例子包括优先级规则、滚动文本显示、一个“旋转轮”进度显示和如何提示用户对特定问题的回答。
该脚本和函数示例不仅对包括你的环境有用,而且它们还提供了很多阅读本书时可能学到的其他示例,我们鼓励读者去亲自试一下它们。
**获得帮助
无论进展如何顺利,或是文档解释的多么清晰,你不可避免仍会遇到一些不理解的内容或工作不正常的情况。这种情况下,仔细阅读文档(计算机上术语为RTFM)已经无法解决问题。在许多情况下,文档可以回答你的问题或指出你哪里出错。
有时你会发现这样做只会使你更糊涂或确信软件出错。那么接着你要做的就是通知本地的bash权威机构来解决该问题。如果这样也不行或找不到权威人士,就必须使用其他方式了(当前只有通过Internet)。
**请教问题
如果你对bash有问题,当前有两种方式可以解答你的问题。可以发电子邮件给bug-bash@prep.ai.mit.edu或将问题邮寄到USENET新闻组gnu.bash.bug。
在这两种方式下,USENET上的bash管理员或一些资深人士都会给你一些建议。提出问题时,要在主题行里给出关于该问题的有意义的总结信息。
**报告故障
故障报告应被发送到bash-maintainers@prep.ai.mit.edu,应包含bash的版本和运行的操作系统、编译bash使用的编译器、对问题的描述、对问题如何产生的描述等,如果可能,还要给出问题的定位。最好的方式是使用安装bash时一同安装的bashbug脚本。
在运行bashbug前,要确保你已经将EDITOR环境变量设置为你熟悉的编辑器,并已经将其导出(bash默认为emacs,在你的系统上可能没有安装它)。当执行bashbug时,它将进入一个带有特定空报告形式的编辑器。某些信息将被自动填充(bash版本、操作系统版本等)。下面对其作了一些简单介绍,但报告中的大部分项都是自解释的。
在From:域中应填入你的电子邮件地址。例如:
From: confused@wonderland.oreilly.com
接下来是Subject:域,也要尽量填写。因为当管理员需要查找你的要求时,这样会便于他操作。只需要用关于本问题的有意义的总结信息替换方括号内的行即可。
下面几行是系统的描述,应保持不动。接着是Description:域,在这里你应该给出关于问题的详细描述以及它与正常方式的差别。描述问题时尽量做到专业和精确。
在Repeat-By:域中应描述是如何生成该问题的。如果需要,应列出精确的键入内容。有时你可能无法再现该问题,当你仍应该使用导致该问题的事件填充该域,尽量使其简短。例如,如果是一个大的shell脚本,尽量把产生问题的部分分离开,并只将它包含在你的报告中。
最后是Fix:域。如果你研究过该问题并发现了出错内容,则可以填上解决该问题的必要的补丁。如果你不知道引起问题的原因,保持空即可。
填完表单后,将其保存并退出编辑器,表单会被自动发送给管理员。