1.    Linux介绍


早期的计算机,指令和数据通常分布在两个独立的存储区域。现代的计算机系统延续了“冯·诺依曼结构”——由出生在匈牙利的计算机科学家约翰 冯·诺依曼提出的设计。这些计算机使用同一存储单元来保存数据和指令。指令和数据被同样对待,可以有效的简化计算机的构造和使用。

基于Unix的操作系统,包含Linux,将这一原则扩展到永久存储器。Linux将磁盘上的信息组织成文件的集合。每一个文件,不论它是程序还是数据,都通用对待,使得操作系统可以简单的构建并灵活的使用。对某些文件操作的命令对其他类的文件有类似的效果,这样就减少了编程者需要学习的命令数量。

本章对Linux操作系统有一个总体的描述,例如:它是如何组织的 ,它的一些约定俗成是什么?如果你是一个Linux新手,后面的章节在实际的例子中示范了这些原则。

Linux的起源


Linux操作系统是一个年轻的学生——Linus Torvalds作为业余爱好而开发的,当时他还是芬兰赫尔辛基大学的学生。他在学习Minix操作系统时,为了扩展Minix的功能,而开发的类Unix 的操作系统。他开始于1991年,当时Linux的版本是0.02,并邀请了其他程序员参与了这个项目。在1994年,版本达到了1.0。

Linux使用GNU通用公共版权(GPL)。它的源代码可以由任何人自由的使用。Linux的发布,带有Linux内核源代码的CD-ROM和其他准备安装的软件并不一定是免费的。但是Linux源代码必须保证是有效的。在发布软件时保持源代码有效称之为开源。

Linux这个词通常使用瑞典的重音来发音,使它区别于北美的发音。通常这样发音LIH-nicks,有时称为LYE-nicks或LEE-nucks。

严格的说,Linux涉及的操作系统内核提供了开始和管理其他程序的功能,并提供了访问系统资源的功能。各种开源的外壳程序、编译器、标准的库和命令组成了另一个项目称之为GNU。GNU项目由免费软件基金会启动,它尝试建立一个免费的UNIX版本。主要的Linux C编译器——gcc也是GNU项目之一。

虽然也有GNU内核项目,但是已经被Linux内核所取代。

严格来说X Windows也不是Linux的组成部分。Xfree86——X Windows的开源版本也可以用于Linux操作系统,并已经发布了不同的版本。

文件和文件系统


每一个Linux磁盘(或其他的长期块存储设备)包含一组文件,文件根据一定的策略或规则进行保存称之为文件系统。每一个磁盘可以划分分区(或片),无论如何每个分区都要他自己的文件系统。Linux并没有严格的限制所有的磁盘只能有一个文件系统。用户可以使用其他操作系统建立的磁盘,就好像它们天生就是Linux磁盘一样。

标准的文件系统是第二扩展文件系统——ext2.这是Minix文件系统的第二个版本,它支持大尺寸磁盘和长文件名。Ext2允许分区高达4TB,文件高达2GB和文件名长达255个字符。新发布的版本使用ext3——可以进行错误恢复特性的ext2版本。

是否支持其他文件系统取决于你再分布时的安装选项。它可以包含微软的NT,苹果的HFS和日志文件系统。

Ext2文件系统使用缓存来提高性能。如果ext2磁盘没有正常关闭,文件可能被破坏或丢失。因此Linux正常关闭是及其重要的,或者要使用不间断电源进行保护也是必要的。

为了节省空间,ext2文件如果包含大量的0数据(稀疏文件)将不会真的保存在磁盘上。某一个外壳命令提供了建立和处理稀疏文件的选项。

文件由文件名进行标识,文件名必须是文件系统允许的名字。实际上,文件名很少超过32个字符,通常由小写字母、大写字母、减号和句号组成。空格和标点符号也是允许的,但是会在脚本程序中引起某些问题,依次要避免使用。

文件ming 不需要后缀来标识它们的内容,但是它们可以用来避免混淆文件的内容,一些常用的后缀如下:

n         .sh——bash外壳脚本

n         .txt——常用的文本文件

n         .log——日志文件

n         .tgz(或.tar.gz)——压缩文件

命令通常不使用后缀。

目录


外壳脚本文件、文本文件、可执行文件和其他正式文件称之为正规文件。它们包含数据或可以执行的指令。还有一些文件不是正规文件,例如:目录或命名管道。它们包含单独的数据或可以访问的特定行为。

文件以目录的形式,或文件列表的形式进行放置。象Linux系统中所有其他的文件一样,目录也被视作文件。。每个目录可以依次包含子目录,构造层次列表。

目录被放置在一个单独树zhong 。目录的最顶部称之为根目录。和其他操作系统不一样,它没有独立的卷标。Linux把所有的磁盘驱动器作为主目录结构中一个子目录。从用户的观点来看,哪一个特定的目录属于哪个磁盘是没有必要知道的。出现在面前的每一样东西仿佛都属于一个单独的磁盘。

路径名是一个字符串,用来标示指定文件的位置,通过路径名可以找到该文件。根目录由一个斜杠(/)来标示。/payroll.dat表示文件payroll.dat位于根目录下。使用更多的目录名和斜杠可以定义额外的目录。

当用户登陆后,它们位于一个自己的目录内称之为home目录。通常,home目录位于/home。/home/jgulbis/payroll.dat表示文件payroll.dat位于home目录下的jgulbis用户内。Home目录在bashzhong 用波浪号(~)表示。

当前目录用句号(.)来表示。如果路径名不是以斜杠开始,Bash假设路径是相对于当前目录。./payroll.dat和payroll.dat都表示文件payroll.dat在当前的目录内。当运行某个程序时,可能不是这样的。下一章将讨论例外情况。

父目录由双句号(..)来表示。双句号可以使用在路径的任意位置,用来表示向根目录方向移动。它可以代替先前在路径中使用的目录。如果当前目录为/home/jgulbis,路径名../kburtch/payroll.dat和/home/kburtch/payroll.dat是相同的。双句号表示/home/jgurbis的父目录/home目录。

不使用斜杠开始的路径名称之为相对路径,因为它们定义的目录是和当前目录相比较的结果。相对路径在使用当前目录和子目录时是特别有用的。

使用斜杠开始的路径名称之为绝对路径。绝对路径描述了文件相对根目录的位置。无论当前目录在哪里,绝对路径总是能准确标识文件。当文件总是保存在相同的目录时,使用绝对路径是非常有用的。

目前没有一个设置规则来说明文件应该保存在哪里,文件的位置根据Linux的发布而定。早期的Unix保存标准程序在/bin中。Home目录在/usr中。特别的程序保存在/usr/bin中。随着程序数量和类型的增加,通用目录也随之增加。

大部分发布的Linux包含以下目录:

n         /dev——包含设备驱动程序的目录

n         /bin和/usr/bin——包含标准Linux程序的目录。

n         /lib和/usr/lib——包含标准的Linux库。

n         /var——包含配置和日志文件的目录。

n         /usr/local/bin——包含不是随发行而来的命令,由管理员增加。

n         /opt——包含商业软件。

n         /tmp——存储临时文件

n         /sbin和/usr/sbin——包含系统管理员命令。

Inode和链接


通常,每个文件被列在一个单独的目录中。Linux可以为某个文件建立额外的列表。这些捷径称之为链接,它可以代表任意文件。

链接文件有两种,硬链接表示在当前目录或不同目录对某个文件的代表,对硬链接执行的任何行为都直接作用到硬链接所代表的文件上。访问硬链接文件不必担心文件会失去参照,因为Linux系统限制了硬链接放置的地方。只要还有一个文件有一个硬链接,他就不会被删除,例如一个文件有一个硬链接,要删除这个文件必须把这个文件和链接文件都删除掉。

第二种也是更常用的链接方式为符号连接。这个链接文件包含所链接文件的路径名,和硬链接不同,符号链接对于它们的使用没有限制。它们的速度更慢,一些命令会影响到链接文件本身而不是它们所指向的文件。符号链接不“硬”,因为它们必须是失去参照的:当Linux打开符号链接文件,它读取当前路径名,而不是打开文件。当代表的文件被删除时,符号链接文件变成一个空链接,指向一个不存在的文件。

使用链接意味着两个不同的路径名可以表示同一个文件。为了标识某个特定的文件,Linux给每一文件分配了一个号码。这个号码称之为索引节点(Inode),他对于任何存储设备都是唯一的。如果两个路径名代表同一个文件拥有相同的索引节点,则其中一个文件为硬链接文件。

在ext2中,有索引节点数量的限制,它相应的也限制了存储在磁盘上文件的数量。索引节点数和磁盘空间大小的比值称之为索引节点密度。这个密度在磁盘或分区在初始化是被指定。大部分已发行的Linux使用的索引节点密度为4K——每4096个字节放置一个索引节点。

管道(pipe)和接口文件(socket file)


管道文件是在两个程序之间进行共享的专用文件。文件实际上是用于共享信息的缓冲区。一个程序向管道文件中写数据,另一个文件从管道文件中读取数据。当这个管道文件的大小达到某个标准,Linux暂停写程序知道读取文件能够跟得上。

类似的文件还有Unix 域接口文件。一个接口文件象管道一样工作,但是它使用网络接口。但是在外壳脚本程序中使用此文件类型是不容易的,它也不在本书的内容之内。

设备文件


非规则文件的最后一个常用文件类型是设备文件。Linux基于文件的设计理念中,设备由文件来表示。设备文件运行你可以直接和连接在计算机上的某个文件进行通讯。实际上有两种设备文件,外壳编程者主要对字符文件设备有兴趣。

所有的设备文件都位于/dev目录中。即使有许多文件都出现在/dev目录中,但是不是所有的文件设备都是存在的。/dev目录中列出的设备是为了当它们连接到计算机上时Linux内核可以进行配置和识别它们。

这些文件中的大部分不是普通用户可以访问的,只有很少的一部分为了通用的目的而开发。一个对所有用户都开放的重要设备文件是/dev/null。这个文件意味着黑洞,发送到这个黑洞的所有东西都会消失不见。这对于外壳程序想要丢弃一些不想看到的东西来说是特别有用的。/dev/null也可以读取,但是这个文件总是空的。

另一个文件是/dev/zero。这个文件包含了一个零的无止境流,也可以建立一个新文件,完全填入零。

还有许多其他的设备文件出现在/dev目录中,具体取决于你的发行部和计算机硬件。常用的设备文件包含如下:

n         /dev/tty——你的程序运行的终端窗口或控制台

n         /dev/dsp——在声卡上演奏AU声音文件的接口

n         /dev/fd0——第一个软盘驱动

n         /dev/hda1——第一个IDE驱动设备分区

n         /dev/sda1——第一个SCSI驱动设备分区

tty的名字表示teletypewriter的缩写,通过电缆连接到计算机的打印机和键盘。

有了这篇Linux世界的概览,你可以通过Bash编写Linux外壳程序了。