LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 9025|回复: 80

[推荐]UNIX 系统(3月30日更新 请勿灌水。谢谢!)

[复制链接]
发表于 2005-4-30 17:28:50 | 显示全部楼层 |阅读模式
第一章:UNIX操作系统简介
学习目标
学完这一章,你能做到以下事情:
描述UNIX系统的基本组成和基本功能
1.1 什么是操作系统?
操作系统是一种特殊的用于控制计算机(硬件)的程序(软件)。
操作系统在资源使用者和资源之间充当中间人的角色。为众多的消耗者协调分配有限的系统资源。系统资源包括,CPU,内存,磁盘,和打印机。举个例子,一个用户(也可以是程序)将一个文件存盘,操作系统就会开始工作:管理磁盘空间的分配,将要保存的信息由内存写到磁盘等。
当用户要运行一个程序时,操作系统必须先将程序载入内存,当程序执行时,操作系统会让程序使用CPU。在一个分时系统中,通常会有多个程序在同一时刻试图使用CPU。
操作系统控制应用程序有序地使用CPU ,就好象一个交通警察在一个复杂的十字路口指挥交通。十字路口就象是CPU;每一条在路口交汇的支路好比一个程序,在同一时间,只有一条路的车可以通过这个路口,而交通警察的作用就是指挥让哪一条路的车通过路口,直到让所有路口的车辆都能通过路口。
UNIX操作系统的历史
UNIX操作系统1969年在贝尔实验室诞生。Ken Thompson 在Rudd Canaday,
,Doug Mcllroy,Joe Ossana,and Dennis Ritchie,的协助下,写出一个小的分时系统,开始得到关注,在许诺为实验室的管理人员提供一个文档准备工具后, UNIX先驱们可以使用到一台更大的计算机,从而得以继续他们的开发工作。
在七十年代的中期,一些大学得到使用UNIX的许可,并很快在学院之间得到广泛流行,其主要的原因是:
小巧:最早的UNIX系统只占用512K字节的磁盘空间,其中系统内核使用16K,用户程序使用8K,文件使用64K。
灵活:源代码是可利用的,UNIX是用高级语言写成,提高了操作系统的可移植性。
便宜:大学能以一盘磁带的价格得到一个UNIX系统的使用许可。早期的UNIX系统提供了强大的性能,使其能在许多昂贵的计算机上运行。
以上优点在当时掩盖了系统的不足:
没有技术支持:AT&T在当时大部分的资源和都用在MUTICS上,没有兴趣
开发UNIX系统。
Bug的修补:由于没有技术支持,bug的修补也得不到保证。
很少的,或者根本没有说明文档:用户有问题经常只能是去看源代码。
当UNIX传播到位于California的Berkeley大学的时候,Berkeley大学的使用者们创建了自己的UNIX版本,在得到国防部得支持后,他们开发出了许多新的特性。但是,作为一个研究机构,Berkeley大学提供的版本和AT&T的版本一样,也没有技术支持。
当 AT&T意识到这种操作系统的潜力后就开始将UNIX商业化,为了加强产品性能,他们在AT&T的不同部门进行UNIX系统开发,并且开始在系统中结合Berkeley开发出的成果。
UNIX最终的成功可以归结为:
一个灵活的、包含多种工具的用户界面与操作环境。
模块化的系统设计可以很容易地加入新的工具。
支持多进程,多用户并发的能力。
Berkeley大学 的DARPA支持。
强大的系统互连的能力。
能在多种硬件平台上运行。
标准化的界面的定义促进应用的可移植性。
1.3 UNIX系统的特性
UNIX为用户提供了一个分时的系统以控制计算机的活动和资源,并且提供一个交互,灵活的操作界。UNIX被设计成为能够同时运行多进程,支持用户之间共享数据。同时,UNIX支持模块化结构,当你安装UNIX操作系统时,你只需要安装你工作需要的部分,例如:UNIX支持许多编程开发工具,但是如果你并不从事开发工作,你只需要安装最少的编译器。用户界面同样支持模块化原则,互不相关的命令能够通过管道相连接用于执行非常复杂的操作。
运行中的系统
内核是运行中的系统,它负责管理系统资源和存取硬件设备。内核中包含有它检测到的每个硬件的驱动模块,这些模块提供了支持程序用来存取CPU、内存、磁盘、终端、网络的功能。当安装了一种新的硬件,新的模块会被加入到内核之中。
运行环境
工具和应用程序
UNIX的模块化设计在这里表现得非常明显,UNIX系统命令的原则就是每条命令做好一件事情,组合一系列命令就组成工具箱,选择合适的命令就可以完成你的工作,恰当地组合这些工具能够帮你完成更复杂的任务。
从开始,UNIX“工具箱”就包括了一些可以同系统进行交互的基本命令,UNIX系统也提供了以下几种工具:
电子邮件(mail,mailx)
文字编辑(ed,ex,vi)
文本处理(sort,grep,wc,awk,sed)
文本格式化(nroff)
程序开发(cc,make,lint,lex)
源程序版本管理(SCCS,RCS)
系统间通讯(uucp)
进程和用户帐号(ps ,du,acctcom)
因为UNIX系统的用户环境被设计为一种交互的,可编程的,模块化的结构,新的工具能很容易地开发,并且添加到用户工具箱之中,而哪些不是必须的工具能够被省略,这种省略不会影响系统的操作。
 举个例子,一个程序员和一个打字员同时在使用UNIX系统,他们会使用许多普通的命令,虽然他们的工作性质不相同。他们会用一些与他们的工作相关的工具。程序员使用的工具会包括程序开发和程序管理的工具,而打字员会使用字处理,文档管理的工具。有趣的是:程序员用来修订程序的工具同时也被打字员用来文档的修订。因此,他们的系统看上去十分相似,但是,每一个用户选择模块都与他或她的应用要求密切相关。
UNIX系统的流行很大程度可以归结与:
UNIX系统的完整性与灵活性使其能适应许多的应用环境。
众多的集成的工具提高了用户的工作效率。
能够移植到不同的硬件平台。
SHELL
Shell 是一个交互的命令解释器。命令是在SHELL提示符下键入,shell会遵照执行键入的命令。用户通过shell与计算机交互。shell从键盘获得用户键入的命令,然后将命令翻译为内核能够理解的格式。然后系统就会执行这个命令。
你会注意到shell与内核是分离的两部分。如果你不喜欢当前shell提供的特性,你能很容易地用另一种shell代替当前的shell。
一些shell是命令行方式,一些提供菜单界面。UNIX系统支持的普通的shell都包括一个命令解释器和一个可编程的接口。
有四个最通用的shell,分别是:
Bourne shell:    
由AT&T提供的最原始的shell,由贝尔实验室的Stephen Bourne开 发。可提供命令的解释,支持可编程接口,提供诸如变量定义、变量替代、变量与文件测试,分支执行与循环执行等功能。
C Shell (/usr/bin/csh):
C Shell是在California Berkeley大学的Bill Joy开发,一般存 在于BSD系统中,于是被称为California  shell,简写名称为C Shell。它被认为是Bourne-Shell的一个改进版本。因为它提供拉交互的特征例如命令堆栈(-允许简单地调用和编辑以前输入的命令,)别名(提供对已有命令取个人的别名)
Korn Shell(/usr/bin/ksh):
贝尔实验室最新的开发成果,由David Korn开发成功。它被认为是是一种增强型的Bourne Shell,因为它提供对简单可编程的 Bourne Shell界面的支持,同时提供C Shell 的简便交互的特征。它的代码也被优化来提供一种更快,更高效的shell。
POSIX Shell:    
POSIX是一种命令解释器和命令编程语言,这种shell同Korn Shell在许多方面都很相似,它提供历史机制,支持工作控制,还提供许多其它有用的特性
表1-1 shell 特征的比较
1.4 UNIX的其他特征
层次化的文件系统
存储在磁盘上的信息称为文件。每一个文件都分配有一个名字,用户通过这个名字来访问文件,文件的内容通常是数据,文本,程序等等,UNIX系统通常有几百个文件存在,于是另外一种容器:目录被用来让用户在一个逻辑上的分组里管理它的文件。在UNIX系统中,目录被用来存储文件和其它的目录。
文件系统的结构非常复杂,如果用户的工作部门改变,用户的文件和目录能很容易移动,改名,或组织到新的或不同的目录中,这些操作只需使用一些简单的 UNIX系统的命令即可完成。文件系统就象一个电子排列柜,它能让用户分割,组织他们的信息到适合自己环境与应用的目录中去。
多任务
在UNIX系统中,能有几个不同的任务在同一时刻执行。 一个用户在一个终端可以执行几个程序,看上去好象是同时在运行。这意味着一个用户可以编辑一个文本文件时格式化另一个文件,同时打印另一个文件
实际上,CPU在同一时刻只能执行一个任务,但是UNIX系统能够将CPU的执行分成时间片,通过调度,使在同一时间内执行,对用户看来,就好象在同时执行不同的程序一样。
多用户
多用户就是允许多个用户在同一时刻登录和使用系统。多个终端和键盘能连接在同一台计算机上。这是多任务功能的一种自然延伸。如果系统能够同时运行多个程序,一些程序也能够支持多个用户线索。另外,一个单个用户能够通过多个终端在不同的时刻登录同一个系统。 这种体系结构的一个很大的好处是:工作组的成员能同时操作相同的数据。
 楼主| 发表于 2005-4-30 17:30:40 | 显示全部楼层
[推荐]用户登录和普通命令定位
第二章:用户登录和普通命令定位
目标
完成了这一章,你能够做以下事情:
登录UNIX系统
退出UNIX系统
使用联机帮助查找命令用法
理解shell命令的格式
用一些简单的命令来鉴别系统用户
用一些简单的命令来与系统中的用户通信
用一些简单的命令来实现多种功能并输出结果
2.1一个典型的终端会话过程
为了能和计算机通信,需要有以下条件:
一个具有完全ASCII字符集的终端
一条连接计算机的数据通信线路
一个登录ID(用户身份确认)
一个密码
一个终端会话过程开始于用户登录一个系统认可的终端,结束于退出信号(logoff),计算机会在你登录期间响应你的键入的命令
UNIX通过用户名(有时也称为登录ID)来识别是否是系统中的用户。你的用户名,就是系统管理员分配给你的名称,通常是你的名字或是名字的缩写。你帐号的密码可以是一个随意的的字符串,你的系统管理员会提供给你一个你可以更改的初始化密码,你的密码是你私人所有的,你自己决定密码是什么,没人知道或能找出你的密码是什么。如果你忘记了你的密码,你就不得不求助于你的系统管理员。因为只有系统管理员有权删除修改用户的密码。
在终端上出现登录提示符时,你就可以输入用户名和密码登录以系统。
在登录上系统后,你可以输入命令,SHELL会解释命令,操作系统会为你执行命令,任何执行命令产生的响应都会显示在你的屏幕上。
当工作结束后,你可以退出系统以终止终端对话,这会释放终端以便让其他人可以通过这台终端登录系统。建议你在离开时退出系统,以防其他人使用你的帐号使用系统。
2.2登录和退出
你需要执行以下步骤来登录系统:
打开终端,如果一些终端显示已经超时(现象为屏幕上没有任何显示)你只需要敲一个键(例如shift键)激活显示。
如果你没有看到login:提示符,或者出现一些垃圾字符,敲一下回车,如果仍旧不工作,敲一下break键。垃圾字符通常是计算机试图以错误的速度与你的终端联结,break键告诉计算机尝试另外一种速度,你可以通过敲break键来实验不同的速度,但记住在每次敲键后要等待机器响应。
当login:提示符出现后,键入你的登录ID。
如果passwd:提示符出现,键入你的密码,为了确保安全,你键入的密码不会在屏幕上显示。
注意:键盘上的退格键在登录过程中没有删除功能。
$符号是Bourne Shell(/usr/old/bin/sh),korn Shell(/usr/bin/ksh),和POSIX Shell (/usr/bin/sh)的标准提示符,而%符通常表示这是C Shell(/usr/bin/csh)。如果你用的是POSIX shell,你会看到一个$提示符。而#提示符一般是为系统管理员保留的。当你以系统管理员的身份登录时,会出现这个符号。这也为你的特殊身份提供一个有用的提示功能:因为作为系统管理员,你能更改(或删除)系统中的任何数据。
密码的说明:
第一次登录系统,你的帐号可能被设置为要你键入密码。你提供的密码必须满足以下条件:
你的密码必须不小于六个字符
前六个字符中至少要有两个字母。
前六个字符中至少要有一个不是字母。
当你第一次输入你的密码后,系统会提示你重新输入一次以确认密码。然后系统会重新出现登录提示符,你可以用你的新的密码来完成登录步骤。
2.3 Shell-命令解释器
当你登录的过程中,shell已经开始在为你工作。终端上会出现提示符,并且解释执行你输入的命令,我们会在本章剩下的部分讨论不同的命令,包括如何使用在线帮助,找出谁登录了你的系统,和如何同你系统中的其他用户通信等等。
正如你在上图中所看到的,shell还支持许多其他的命令解释功能
2.4 命令行的格式
在你看到shell提示符($)后,你就可以键入命令。一个正确的命令名通常是在命令行的第一项。许多的命令还有命令选项,选项的作用是为了扩展命令功能,而参数通常是一些文本,一个文件名,或者是目录名等命令可以操作的东西。选项通常以短横线(-)开始。
空字符的作用是分割命令,选项,参数,空字符被定义为一个或多个空格符(space),或TAB键,例如:命令echo Hi和echoHi是有很大的差别的,计算机会将第一个理解为命令echo 和一个命令的参数 (Hi),而第二个会被认为是一个名为echoHi的命令,而这个命令可能不是一个有效的命令
每个命令输入之后都应该输入回车符,回车符会将命令送往计算机执行。在上图中,回车符会被系统识别,而其他的字符不会产生作用。
终端的输入支持“预键入”,预先键入的意思是在你键入一个命令后在提示符返回前立即键入另一个命令,你键入的命令会先被缓存,并在当前命令执行完成之后执行。
注意:UNIX的命令是对大小写敏感的,大多数的命令和参数都是小写字符。因而,“echo hi”是一个合法的命令而ECHO hi不能被系统识别。
注意:你可以同时键入两个命令,方法是用分号(;)分割两个命令,
如:
$ ls;pwd
2.5 第二提示符
Bourne ,Korn,和POSIX shells 都支持多命令行。如果shell要求更多的输入来完成一个
命令,在回车前,就会出现第二提示符(>)。
有些命令是成对出现的,而有的字符要求有结束字符,(例如一个开始的 if 要求 fi
来结束,开始的括号要求一个结束的括号,一个开始的引号要求一个结束的引号。)
如果你键入一个错误的命令,就像上图中描述的一样,SHELL会显示第二提示符。通常按ctrl +c会中止当前正在运行的程序,然后返回到SHELL提示符下,你可以通过 stty
-a 命令来自行定义你的中止键
2.6 帮助手册
联机帮助手册对查找命令用法非常有用,但是它不是作为教材而设计的,它对学习如何使用UNIX操作系统的帮助也不大。有经验的UNIX系统用户使用帮助来查找命令的细节和用法
就像上图中表示的那样,帮助手册被分为几个部分。
以下是每一节的简短的说明:
第一节:用户命令
这一节描述直接被用户或是shell脚本使用的程序。任何系统中的用户都可以使用这个帮助。
第1M节:系统维护
这一节描述系统管理员用来维护系统的命令的使用,只有root用户才能使用。
第二节:系统调用
这一节描述与UNIX系统内核接口的函数,包括C语言的接口。
第三节:函数与函数库 
这一节阐述了系统提供的与直接系统调用不同的一些二进制格式的函数。这些函数通常通过C程序来存取,例如:输入输出处理和数学计算的函数。
第四节:文件格式
这一节定义用户配置文件的组成,文档,和不同文件类型的格式(例如a.out)
第五节:多方面的主题
这一节包括不同的信息,例如头文件的描述,字符集,宏包。和其它的主题。
第七节: 特殊的设备文件
这一节讨论特殊的设备文件的特性,这些文件提供uniz系统与系统I/O设备,如磁盘,磁带机,打印机)之间的链接。
第九节:字典
这一节定义了贯穿整个帮助手册中的术语。
在每一个章节里,命令以字母的顺序列出,用户可以通过检索手册的索引来找到 一个命令。
2.7 手册页中的内容
了解帮助页的格式是非常重要的。在整个UNIX系统的文档中,参考以cmd(n)的格式给出,其中cmd是命令名,而n 代表八个帮助章节的其中一个,因而,date(1)代表在帮助手册第一节中关于date命令的内容,在每一个章节里,命令是以字母的顺序列出的,这是由维护帮助手册的方式造成的,页的编号没有意义,每一个命令都是从第一页开始的。
每一个帮助页(一些命令有多个帮助页)有几个主要的标题。帮助页也不总是有标题。
以下是每个标题的列表和其内容的描述;
名字 包括命令名和简短的描述,章节中的这个文本被用来产生索引。
大纲 定义了如何引用一个命令。黑体字的条目表示必须在终端上正确输入的部分。方括    号中的是任选项,规则类型的条款会被你所选择的合适的文本所代替,省略号(     .....)被用来显示先前重复的参数。如果对摘要的意思有疑问,你可以去阅      读DESCRIPTION项。
描述          包括每个命令和选项的功能的详细描述。
额外的影响       提供不同口语的编程信息,这对于国际化的支持非常有用。
网络特性        基于网络特征的功能。
返回值         描述程序调用完成后的返回值。
诊断信息        解释命令可能出现的错误信息
错误          列出错误的条件合相应的错误信息或是返回值。
范例          提供命令使用的范例。
警告          指出潜在的陷阱。
相关性         指出与不同硬件平台相关的UNIX系统操作的变化。
作者          命令的开发人员。
文件          命令使用的任何特殊的文件。
SEE ALSO        指明帮助手册中的其他页,或是其他包含附加信息的文档。
    BUGS          讨论已知的漏洞和缺陷和所支持的修正
标准一致性       描述每一个条目支持的标准。
2.9 联机手册
有另外一种方法从帮助手册中检索信息。
在许多UNIX 系统中,帮助手册通常是在线的。在线帮助手册通过 man 命令来存取。
语法是:
man -k keyword
或者
man [12345791m] command
其中:
man -k keyword 列出所有的命令,在命令描述中有字符串 keyword。
man [1234579m] command 显示指明帮助章节的命令的帮助页。
man command  显示命令的默认的帮助条目。也许一个
       命令的条目,在不止一个的帮助页中。
以上的所有的命令要求系统管理员已经正确地安装了在线帮助。在以上的例子中,
man passwd 会显出改变密码的命令。man 4 passwd会显示passwd 文件的格式。
在指定命令的帮助条目的第一页已经出现在屏幕上。你可以使用以下的方法浏览:
return 显示下一行
space 显示下一页
Q或q 退出 man 命令并且回到提示符下:
有时,在你读取在线手册时会看到一下的信息:
reformatting retry .wait..............
这个信息的意思是指定命令的帮助手册页需要解压缩,因为对当前用户来说是第一次使用。这条信息在用户下一次检索这个手册时不会再出现。
多个帮助手册页
一些命令有多个帮助条目。你可以用 whereis 命令来显示帮助的章节。例如:
$ whereis passwd
passwd :/sbin/passwd /usr/bin/passwd /usr/share/man/man.1.z/passwd.1
/usr/share/man/man4.Z/passwd.4
$whereis nothere
nothere:
这说明在章节1和4中有一个关于passwd命令的帮助条目,没有关于nothere 的帮助手册。
2.10 一些初级命令
我们将学习一些基本的命令,其中的大多数命令除本书提到的选项之外的还有更多的选项,你可以使用联机手册来了解其它的选项的用法。
id 命令
为了用户存取文件和执行程序的安全性考虑,UNIX必须要知道你的用户和组的id号,这种由操作系统维护ID号,对应哪些为用户方便而使用文字名称,当你登录时,系统会使用ID号确认你的身份。在你已经登录后,你也可以更改你的用户和组。id 命令的作用就是显示你当前的用户和组的定义。
计算机将所有的用户的信息存储在文件 /etc/passwd中,组的信息存储在/etc/group中。

组的用途在于可以让一组用户共享地存取文件。只有系统管理员才能定义组中的用户,每一个用户都能存在于不同的组中。组通常由机构中已经定义的工作组组成。例如,一个机构可能由生产,管理,帐务组组成。这些组的用户结构可能定义为一下的结构:
*号指明登录时的组的定义
其中:
chris 是所有的三个组的成员。
mike 是两个组的成员。
因而,chris能够使用与生产,管理,帐务三个部门有关的文件,mike能够存取与生产,帐务部门有关的文件。其他的用户只能存取他们登录组中的文件。
who 命令
who命令可以报告哪些用户登录系统,每一个用户连接的终端和登录时间的信息。who am i 报告本用户的用户名和端口信息,whoami 命令报告系统与本地终端的关联的用户名。用户是否有权执行一个命令,依靠的是用户的ID,一个用户能够通过更改他的身份ID来存取其它的命令或程序。
date 命令
date 命令被用来报告系统的当前日期和时间。date可以加上参数来更改输出的格式
通常date命令不带任何选项和参数使用。
系统管理员有权限修改系统时间和日期。
passwd 命令
在许多的系统中,系统管理员控制着用户的密码。在UNIX系统中,系统管理员能允许用户直接控制他们自己的密码,用户可以使用passwd命令改变他们的口令,语法如下:
$ passwd
输入这个命令后,系统会要求输入你当前的密码,(老密码)。这是为了避免在你登录了系统后,离开你的终端时间内有人更改你的密码。然后系统会要求你输入新密码,并要求重输入一次以确认你的新密码,这样做是为了避免你打字的错误。你的新旧密码必须至少有三个字符不同。
在你输入密码时,新旧密码字符都不会出现在屏幕上。
密码限制:
你的密码至少有六个字符,前六个字符中至少要有两个是字母,前六个字符中至少有一个不是字母。
系统管理员不受这些规则限制,所以如果系统管理员给你的帐号分配一个密码,这个密码可能不符合这些规则。
echo命令
echo命令使你可以显示命令行参数的,这个意思是,一个如下的命令:
$ echo hello
输出:
helllo
这看上去十分平常,但是这个命令让我们可以?浞奖愕卦趕hell程序中显示用户信息和检查shell变量的值。在shell编程中,echo命令用的很普遍。
clear 命令
clear命令清除终端屏幕上的字符。这个命令仅仅清除当前的屏幕,所以,用户有可能向上翻屏来查看以前的屏幕信息,想要清除所有的屏幕信息,按HOME 键,将光标至到home,然后键入clear 命令。
write 命令
使用write 命令可以向当前登录到同一个系统的用户的终端发送信息。当你使用write时,write 会让你输入信息,每一次你敲回车,信息就会被传送到接收者的终端上,接收者可以向你回写信息,你可以通过你的终端进行交互的对话。当你完成键入信息后,敲入ctrl+d.就可以结束你的对话。
注意:除非你已经禁用此项功能,否则别人在任何时候都可以发送信息到你的终端上来,如果这时你正在使用一个工具,如man,mail,或是一个编辑器的时候,这些信息会出现在你的屏幕上,并与你正常的信息交错在一起,因此造成混乱。
如果你想要发送信息给一个用户,而这个用户当前没有登录系统,你会得到如下提示:
    user is not logged on(用户没有登录系统),其中user表示你试图发送信息的人的用户名
mesg 命令
你可以通过mesg命令禁止其它用户发送信息到你的终端。如果你给一个已经禁止接收其它用户发送信息的用户发送信息,你会接到Permission Denied 错误。
mesg n 拒绝其他人write 到你的终端。
mesg y 允许其他人write 到你的终端。
mesg 报告是允许或是不允许其他人写到你的终端。
即使你的终端是禁止写入的,系统管理员一样能发送信息到你的终端。
news 命令
系统中的所有用户都感兴趣的信息可以通过news命令广播出去。这个命令通常是系统管理员对系统中所有用户进行通告的时候,例如在系统关闭,备份时,或是在新的硬件生效时使用。
你可以键入news命令来阅读新闻。如果命令后没有选项,只有那些你还没有阅读过的信息会显示。
    news命令的选项有:
-a 读取所有的新闻,不管是否已经被读取过。
-n 只显示未读过的新闻的标题
每一个存取新闻的用户在他的HOME目录下都有一个.news_time文件。每一个UNIX系统中的文件都有一个时间标志,时间标志记录有上一次文件被修改的时间。.news_time上的时间标志会被更新,以匹配你最后读取得新闻信息的时间。如果一条新的新闻加入,news命令知道这条新闻还没有被阅读,因为你的.news_time文件的时间标志比新的新闻的时间标志早。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:32:49 | 显示全部楼层
[推荐]文件系统导航
第三章:文件系统导航
第三章 文件系统
目标
完成这一节,你能做以下事情:
描述UNIX文件系统的布局
了解文件与目录的不同之处
自如地操作一个UNIX 文件系统。
建立和删除目录
描述绝对路径和相对路径的不同
在可能的情况下,使用相对路径来简化你的输入。
3.1 什么是文件系统 
UNIX系统提供文件系统来管理和组织你的文件和目录。文件通常是数据的一个容器,而目录是文件和(或)其他目录的容器,一个目录包含下的另一个目录通常被称为子目录,
UNIX的文件系统与文件柜十分相似。整个文件系统就象一个文件柜,文件柜包含所有的抽屉,文件夹,和报表。抽屉同子目录一样能够包含报告和文件夹。一个文件夹当它包含报表时就像一个子目录。报表就代表一个文件,因为它存储实际的数据。
3.2 树型结构 
目录结构能够用一个层次化的树形结构来表示。树上的每一个分支可以是目录或者文件。目录用椭圆来表示,文件用矩形来表示,以便在图中能够区别它们。
3.3 文件系统层次
象整齐的文件柜一样,UNIX文件系统层次提供了一种简单有效的机制来组织你的文件。由于一个UNIX发布版本通常包括几百个文件和程序,所以每个 UNIX系统都使用一种默认的目录结构。在目录的顶端是根目录(因为它在一个倒转的树的顶部),根目录由一个反斜杠(/)来表示。
UNIX 系统同时提供了一些命令,可以让你在你需要时很容易地创建新的目录,也可以从一个目录移动或是拷贝文件到另一个目录。就象加入一个新的文件夹到一个文件柜的抽屉中和将新的文件夹移动一个报表到一个老的文件夹一样容易。
UNIX系统中的文件可以分为两类:静态文件和动态文件。
静态文件(共享的文件)主要存在于三个目录中:/opt, /usr , /sbin
/opt:这个目录一般用来存放应用程序。开发人员和系统管理员会用它来安装新的产品和本地使用的应用程序。
/usr/bin:这个目录包含了基础的UNIX系统操作和文件处理的命令,所有的用户都有权限读取这个目录("bin" 是 binary 的缩写)。
/usr/sbin: 这个目录中有所有的在帮助手册1m章节中的命令,这些命令都是系统管理命令。其中的大多数命令只有超级用户才能使用。在帮助手册 1m中有关于这些命令的文档。
/usr/lib:这个目录包括应用程序使用的文档和共享的库
    /usr/share:这个目录包括独立提供的文件(其中最重要的是帮助手册)
/usr/share/man:这个目录包括所有的语在线帮助页有关的所有的文件。
    /uar/local/bin:这个目录通常用来存放本地开发的程序和工具。
/usr/contrib/bin:这个目录通常用来存放公用的程序和工具
    /sbin:这个目录包括基本的用于启动与关闭系统的命令。
动态文件
动态文件(私有的文件)主要存在于七个目录中:
/home, /etc, /stand , /tmp , /dev, /mnt , 和/var;
    /home  每一个UNIX系统的用户都有他或她自己的帐号。同登录id和口令一起,系统管理员会分配给你一个你自己的目录。 而这个目录一般都存放在 /home目录下。用户对自己的目录有完全的控制权,并负责对自己的目录下面的子目录和文件进行组织和管理。当你登录进一个系统,你会进入与你帐号相联系的目录中,这个目录,通常被称为HOME目录或是登录目录。从这个目录出发,你可以进入任何你有权进入的其它目录,至少你可以存取在你HOME 目录中的任何东西;甚至你还可移动到UNIX系统的其它目录中(默认情况如此),除非系统管理员限制用户对系统中特殊目录的存取。
/etc  这个目录中有许多的系统配置文件,这些文件在帮助手册第四节有说明文档。
/stand/vmUNIX   这个文件存储的是UNIX系统内核的文件。当系统启动时,会将这个文件装载入内存,对通过内核对所有的系统操作进行控制。
/tmp  这个目录通常用作操作系统的一个临时空间,操作系统创建中间文件,或是应用程序或者用户的临时文件通常都是放在这个目录下面。
注意:UNIX系统的惯例:无论何时,都可以删除tmp目录下的任何文件。
/dev  这个目录下有那些可以被联接到你系统中的硬件设备的文件,由于这些设备是作为一个到设备之间的联接,数据从来不会被直接存储到这些文件中,这些问文件通常被叫 做特殊文件或是设备文件。
/mnt  这个用来安装其它的设备 (例如:光驱)
/var/mail     这个目录包括每一个有邮件的用户的信箱。
/var/news     这个目录包括当前的新闻信息的所有的文件。他的内容可以通过键入news -a 来显示。
/var/tmp      这个目录通常被用于用户的临时空间。
3.4 目录名称
绝对路径:          相对于/home/user3的路径
   /home/user3/f1         f1
   /home/user3/memo        memo
   /home/user3/memo/f1      memo/f1
               相对/home/user1的路径
   /home/user1/f1         f1
许多的UNIX系统命令的操作对象是文件和目录。由于系统中的文件和目录很多,并且有可能有同名的文件名或者目录名。为了指明你需要对哪个文件或目录进行操作,需要提供一个路径名作为这个命令的一个参数。路径名代表遍历一个层次结构来找到你所需要的文件或目录所经历的路由。
$ command [options] [pathname pathname.......]
为了阐明目录名的概念,我们使用模拟的方法,用一只铅笔从沿着UNIX系统的树形结构从一个位置画到另一个位置。路径名也就是铅笔的笔迹通过的层次结构所遇到的节点(即目录)的一个列表,这个列表直到你想要到达的目录或文件为止。
当指明文件或目录的路径名时,反斜杠(/)被用来分割目录或文件名。
   Directory/directory/directory(目录/目录/目录)
   Directory/file(目录/文件)
  每当你登录一个UNIX系统,你都会发现你存在于层次结构的一个目录下,你可以 通过UNIX系统命令来将你更换到另外的目录中去,但无论什么时候你都是在处在一个目录下。举个例子:当你登录一个系统,系统会初始化将你置于你的HOME目录中。
  绝对路径和相对路径都能够指明文件和目录的位置
绝对路径
给出文件或目录的位置的完全的描述。
通常由层次结构的顶端开始(根目录)。
通常第一个字符是 /。
不关心你当前在目录结构中所处的位置。
整个目录结构只有一条路线。
绝对路径名的例子
以下的路径名指明目录结构中的所有的叫做 f1 的文件的位置。请注意,有许多f1 文件,但是每一个文件的绝对路径都是不相同的。
/tmp/f1
/home/user1/f1
/home/user2/f1
/home/user2/f1
/home/user2/f1
/home/user3/memo/f1
相对路径
通常由目录结构中的当前的位置开始
不由 "/" 开始。
相对当前的位置只有唯一表示方法。
一般都比绝对路径要短。
相对路径的例子
以下的例子再次指明名为 f1 的文件的路径,但是这些路径的定义必须依靠用户在目录结构中的当前位置。
假设当前的位置是 /home:
user1/f1
user2/f1
user3/f1
user3/memo/f1
假设当前的位置是/home/user3:
f1
memo/f1
假设当前的位置是/home/user3/memo
f1 
请f1不是唯一的,但是UNIX系统知道应该去找哪个文件,因为系统知道你是在/home/user1检索/home/user1/f1,还是在 /home/user3/memo的位置检索/home/user3/memo/f1。同时,你可能已经注意到:相对路径可能比绝对路径要短的多,例如,如果在目录/home/user3/mem中,你可以用一下两个命令来打印文件f1:
绝对路径: lp /home/user3/memo/f1
相对路径: lp f1
这表明使用相对路径名可以减少你大量的键盘操作。
注意:如果系统中有同名的文件存在于不同的目录中,而你又要使用相对路径来存取文件,这时,知道你当前的位置是非常重要的。
在 UNIX 系统内部是通过绝对路径来查找所有的目录和文件。因为绝对路径名可以绝对并且唯一地确定一个文件和目录,(由于只有一个根(/)),UNIX系统允许使用相对路径仅仅是为了方便用户的键入。
3.5 一些特殊的目录
绝对路径        相对于/home/user3的路径
/home        ..
/home/user2     ../user2
/home/user1/f1   ../user1/f1
/          ../..
/tmp/f1       ../../tmp/f1
/usr/bin/vi     ../../bin/vi
任何目录在创建时,两个条目会自动被创建,它们分别是 点(.),和点点(..)。在使用相对路径的时候通常会用到这两个条目。在上一个例子中,你也许已经注意到:相对路径的例子仅仅只能向下穿越文件结构,但如果使用.. ,你也能够向上穿越文件系统。
登录目录
当一个新的用户被加入到系统中,他(或她)会被分配一个登录id,可能还有一个密码,和一个用户自己拥有和控制的目录。这个目录通常创建在/home目录下,与用户的登录id名相同,然后这个用户就可以在此目录下任意创建自己的文件和子目录。
当你登录一个系统时,你会自动处于这个目录中,这个目录被称为你的登录目录或者是你的HOME目录。
点(.)
这个称为点的条目代表你当前所在地目录。
点(.)的例子
如果你当前正处于目录/home/user3中:
. 代表你当前的,目录/home/user3
./f1 代表 /home/user3/f1
./memo/f1 代表/home/user3/memo/f1
点点(..)
这个称为点点的条目代表当前目录的上一级目录。通常被称为父目录。每一个目录在自己的下面都可以有多个文件和多个子目录。但是每一个目录只能有一个父目录。这样,当向上进入文件系统的结构时不会混淆。
根目录(/)象其他的目录一样,包含有点,和点点条目,但是由于根目录没有父目录,所以它的点点代表是根目录本身。
点点(..)的例子:
如果你当前所在地目录是/home
.. 代表/ 目录
../.. 同样代表/目录
../tmp 代表 /tmp
../tmp/f1 代表/tmp/f1
如果你当前的目录是/home/user3
.. 代表 /home目录
../.. 代表/ 目录
../user2 代表/home/user2
../user1/f1 代表/home/user1/f1
../../tmp/f1 代表/tmp/f1
在例子的最后,你会发现绝对路径比相对路径还要短,所以有一个原则就是:如果相对路径使你穿越 / 目录,使用绝对路径会比相对路径更方便。
3.6 基本的文件系统命令
  目录,就像一个文件夹,是组织你的文件的一种方式。下部分会介绍基本的目录操作命令,这些命令可以:
显示你当前所处的位置的目录名
了解当前目录下有什么文件和目录。
使你进入文件系统中的另一个目录中去
创建一个目录
删除一个目录
在这一节中,我们不会去操作一个目录中的文件,我们只操作目录。
3.7 pwd―Prenset working Directory (呈现工作中的目录)
无论何时你登录你的UNIX系统,你都会被置于文件系统中的某个目录下,这个目录通常被认为是你的工作目录。
pwd命令会报告你当前在UNIX文件系统中位置的绝对路径名,pwd是英文“呈现工作目录”的一个缩写。
由于UNIX系统允许用户在文件系统中任意地移动位置,所以用户都会依靠这个命令来确定他们在系统中的位置。新用户在文件系统中移动的时候,会频繁地使用这个命令来了解他们的当前的位置
3.8 ls ―列出目录中的内容
ls 命令的作用是列出目录和文件的名称
如果没有参数,ls 会列出当前目录下的文件和目录名。
ls 也可以接收指定文件或目录的相对和绝对路径名作为参数。当文件的路径被提供给ls,ls 会报告指定文件的信息。当一个目录的路径被提供给ls ,ls 会显示指定目录中的内容。
ls 有许多选项。这些选项提供附加的信息。一个命令行可以支持多个选项,以显示更多更全的文件或目录的信息。其中常用的选项如下:
-a  列出所有的文件,包括以点(.)开头的文件,通常,这些文件是隐藏的,除非 使用–a选项才会显现出来,这些以点开始的文件通常记录你用户线索 和应用的配置信息。
-d  列出目录的描述,而不是列出目录的内容。通常与-l一起使用来显示目录的状态。
-l  提供一个关于每个文件德描述属性的长列表,包括类型,模式,链接数,属
主,组,大小(字节),更改日期,和名称。
-F 在每个目录后面添加反斜杠(/),在可执行文件后面添加星号(*)。
-R 递归地列出给出的目录和所有子目录中的文件。
例子:
$pwd
$/home/user3 绝对路径作为一个参数
$ls –F .. 相对路径作为一个参数
user1/user2/user3/
$ls –F ../user1 相对路径作为一个参数
f1
$ls –l memo 一个目录的相对路径作为一个参数
-rw-rw-rw 1 user3 class 27 Jan 24 06:11 f1
-rw-rw-rw 1 user3 class 37 Jan 23 19:03 f2
$ls –ld memo 显示目录memo的信息
drwxr-xr-x 2 user3 class 1024 Jan 20 10:23 memo
$ls –l f1 f2 多个参数,文件的相对路径
-rw-rw-rw 1 user3 class 27 Jan 24 06:11 f1
-rw-rw-rw 1 user3 class 37 Jan 37 19:03 f2
$ls –R 子目录的递归列表
./memo:
f1 f2
$ls user2
user2 not found 当前目录中不存在user2
3.9 cd ―Change Directory(改变目录)  
  目录的树形结构可以看成一个显示你系统中的所有的目录和文件的位置的一个道路交通图。你通常在一个目录中, cd 命令让你改变目录,并且移动到层次结构中的其他位置。
语法:
cd path_name
其中,路径名是你想要去的目录相对或绝对的路径名。当执行cd命令不带参数时,你会回到你的HOME目录,所以,如果你在目录中迷路,简单地键入cd 会让你回到HOME目录。
注释:当使用cd命令在文件系统中移动时,切记要经常使用pwd命令来确认你所处的位置
POSIX Shell 中的 cd命令
POSIX shell 记录有你上一次进入的目录的位置,cd 命令同样有改变目录到你期望的目录的功能。但它还有一些附加的特征可以减少你的键入。
cd 命令有一个你先前进入的目录的储存器,(存储在环境变量OLDPWD中),这个目录可以通过 cd – 来存取。
$pwd
/home/user3/tree
$cd /tmp
$ pwd
/tmp
$cd – 让你进入到先前进入的目录
$pwd
/home/user3/tree
3.10 find 命令
find命令是在唯一个在文件系统中进行查找的命令。这个命令执行非常慢,并且会耗费许多CPU资源。因此建议不要经常使用。
路径列表是一个路径名的列表,典型的情况是一个目录的情况。通常是点文件。在查找一个文件时会被递归地搜寻路径名,查找符合表达式定义的文件。一个最普通的查找任务就是显示出匹配的路径名。
表达式由关键字和参数组成,参数能指明查找标准和查找一个匹配的任务,一件使查找操作更复杂的事情是表达式中使用的关键字都以-开头,这样看上去参数在选项之前似的
3.11 mkdir 和 rmddir 创建和删除目录
mkdir 命令可以创建目录,这些目录能被用来帮助组织我们的文件。每当一个目录被创建,两个子目录会被自动地创建,它们是代表当前目录的点(.),和代表父母目录的点点(..),请注意,创建目录不会改变你当前在文件系统中的位置。
在默认的情况下,创建目录时指明的相对或绝对路径中的所有的中间目录都必须是已存在的目录,但另外一种情况,你可以使用一下的选项:
-p 如果中间目录不存在,将会创建这些目录
-m mode (模式) 在创建了指定的目录后,目录被设置成默认的权限。
以下的命令创建fruit 目录 ,假设这个目录并不存在。
$mkdir –p fruit/apple fruit/grape fruit/orange
rmdir命令可以删除一个目录,被删除的目录必须是空的(也就是除了点和点点外没有其他的东西),同时,你不能删除在你当前目录和根目录之间的目录。
两个命令都可以有多个参数,mkdir的参数代表的是新的目录名,rmdir 的参数必须是已经存在的目录名。
3.12 复习
使用上图来复习cd 和 pwd 命令的用法,和绝对路径和相对路径的用法
在上图中,如果你从目录user3开始,每一个cd 命令的结果会使你处于上什么位置?
$pwd    /home/user3
$cd ..
$pwd    ........................
$cd usr
$pwd   ..........................
$cd /usr
$pwd   ............................
$cd ../tmp
$pwd   .............................
$cd .
$pwd   ..............................
3.13 文件系统―总结
文件      一个数据的容器
目录      文件和其他目录的容器
树形结构    UNIX系统的一种层次化的结构
路径名     文件和目录在层次结构中的位置的一种确认标识。
HOME      代表你登录目录的路径名
pwd        显示你当前在系统中的位置
cd       更改你当前的位置到其他的目录中去
ls       列出目录中的内容
find      查找指定的文件
mkdir     创建目录
rmdir     删除目录
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:34:49 | 显示全部楼层
[推荐]管理文件
第四章:管理文件
目标
完成这一章,你能做以下事情:
使用文件操作命令对文件进行操作。
解释排队打印队列的作用。
认识和使用 交互性的排队打印命令。
监视排队打印系统的状态。
4.1 什么是文件
一个数据的容器或者是一个设备的链接
 每一个文件有一个名字,文件可能保存有存储在磁盘上的数据
 有几种不同类别的文件:
- 普通文件
- 文本文件,数据文件,图片
- 可执行的程序
- 目录
- 设备文件
UNIX系统中的每一事物都是一个文件,包括:
普通文件: 文本,邮件信息,数据,图片,程序源代码
程序: 可执行的程序,例如 ksh,who,date,man,和ls
目录: 特殊的文件,记录有所包含的文件和目录的名字和文件系统中的标识。
设备文件: 一种特殊的文件,提供到硬件设备的接口,包括有磁盘,终端,打印机,内存
简单地说,文件就是联接存储在一个存储设备(通常是磁盘)上的数据的一个名字,
在UNIX之前的操作系统中,文件仅仅是一个数据字节流的定义。没有预定义的记录,域,记录结束标志,文件结束标志。这为应用开发人员提供了许多的灵活性,他们可以定义自己的内部文件的描述。
普通文件通常包含有ASCII 码的字符,典型的普通文件的创建是在终端上使用一个文本编辑器。
程序文件是包含可执行指令的普通文件。通常包含在终端上不能显示的编译过的代码 如(mail,who,date),或者是可以显示到终端上的UNIX系统shell命令,(通常是shell 脚本)
目录是一个特殊的包含它下面的文件和目录的名字的文件,目录同时也存储了每个条目的inode (i节点号),inode号标识有文件信息和数据在文件系统中存储的地址。(注意:目录不是普通的文本文件)
设备文件是一种特殊的文件,它提供了内核与实际硬件设备的接口,由于这些文件是作为接口存在的,它们不会存储有任何实际的数据。它们一般都在/dev目录下,你的计算机的每一个需要联接的硬件设备都会有一个设备文件相对应。
我们能够对文件进行什么操作?
ls 查看一个文件的描述
cat 查看一个文件的内容
more 查看一个文件的内容,一次一屏
lp 打印一个文件
cp 制造一个文件的一个拷贝。
mv 改变一个文件或者目录的名字
mv 将一个文件移动到另外一个目录中去
ln 为一个文件创建另外一个文件
rm 删除一个文件
在UNIX系统上的大多数活动是围绕文件和目录进行的,有许多的命令来操作文件和目录。
你已经知道一些目录操作的命令,在这一章中,我们会介绍其他的用于文件和目录的命令。
你也许会创建文件和处理文件中的内容。这通常可以使用编辑器来完,例如vi.。
4.3 文件的描述
一个文件有几个相关的描述,可以用ls –l 来显示这些描述
类型     普通文件或是特殊文件
权限或模式  文件的存取定义
链接数    与一个独立的数据集相关联的文件名的数目
属主     文件所有者的用户标识
组      文件存取得组的标识
大小     文件包含的字节数
时间标志   最后更改的日期
名字     最大14个字符(如果长文件名支持,最大255个字符)
文件命名规范
最大14个字符
最大255个字符,(如果长文件名支持)。
一般由字母(a-zA-Z),数字(0-9),点(.),短横线(-)和下划线(_),组成。
有许多其他的字符在shell中有“特殊”的意义,例如空格和反斜杠,所以你一般不能用这些字符组成一个文件名。其他的特殊字符有,*,<,>,\,$,|。如果你试图用这些字符组成一个文件名,你经常会得到不能预料的结果。
两个单词组成的文件名一般由下划线来联接:
$cd a dir 错误的语法
cd 看到两个参数
$cd a_dir 合法的语法
cd只看到一个参数
在UNIX 系统中,点(.)是一个普通的字符,所以,它能出现在文件名的任何位置,文件名a.bcdefg,a.b.c.d,和a…b都是合法的文件名。点只有一点特殊,就是作为一个文件名的第一个字符的时候,在这种情况下它指明这是一个隐藏文件。你可以使用ls –a来显示一个隐藏文件。
文件类型
UNIX系统支持很多的文件类型,使用ls –l 输出的第一个字符表示文件类型。普通的文件类型包括:
普通文件
d 目录
l 链接文件
n 网络专用文件
c 字符设备文件(终端,打印机)
b 块设备文件(磁盘)
p 命名的管道(一种内部过程通信通道)
cat 显示一个文件的内容
cat命令是用来联结(concatenate),和无缝地显示一个文件的内容。它不对文件的输出进行格式化,包括在一个文件的末尾和下一个文件的开始之间没有分割符。
语法:
cat [file…]
一个典型的cat 命令的运用是查看单个文件的内容。例如:
cat funfile
这会将文件funfile的内容输出到屏幕上,然而,如果这个文件超过终端屏幕显示的大小,文件的文本会快速地向下滚动使你几乎看不清楚内容。所以我们需要一个更加聪明的方法来在屏幕上显示文件的内容。
当cat 命令不带任何参数使用的时候,它会等待你从键盘输入,就和你使用mail,write命令一样,回车加,ctrl +d用来结束输入,一旦你的输入结束,你输入的文本会在屏幕上显示出来。
注意: 如果文件包括控制字符,例如一个已编译的程序,你cat这个文件到你的终端,你的终端可能会失效。你可以用以下一种方法重新设置你的终端:
方法1:
试图退出登录(回车后使用exit 命令)。
开关你的终端(关掉然后又打开)。
重新登录(你能登录继续正常工作)。
方法2:
敲入break键。
同时按下shift+ctrl+reset
回车
Tset –e –k
Tabs
另外,你的系统管理员可以终止你的终端对话。
more – 显示一个文件的内容
more 命令显示出文件的内容,它一次仅仅只能显示一屏。要看下一屏,敲一下空格键。要看下一行,敲一下回车键。想要退出more命令,敲一下q。
more 命令支持许多其他的特征,你可以使用手册来查找其他有用的用法的详细说明。
tail--- 显示文件的末尾
语法:
tail [-n] [文件名]
tail命令的作用是显示一个文件的最后 n 行。(注释:如果没有指定,n 的默认值是10),这个命令对那些周期性添加信息的长的日志文件特别有用。使用tail 命令,你可以直接看到已记录的最后的信息,而不需要用cat和more 来滚动整个文件到末尾。
4.7 排队打印缓冲系统
UNIX操作系统提供一种称为排队打印缓冲系统的工具用来配置和控制你系统中的打印。lp缓冲区的机制是:接受系统中的所有用户打印请求,然后配置打印机,让打印机一次打印一个请求。想一想如果我们没有一个打印缓冲,每一次一个用户想要打印一个文件,他或她不得不先确认当前没有其他的人在打印文件。而一个打印机是不可能供两个用户同时使用的。
lp缓冲系统有许多的特性,这些特性可以让打印平稳进行,并最大限度地减少管理员的干预。你提交打印请求到lp打印缓冲区,在那里打印请求会在一个队列里等待打印。你可以检查队列中的文件和系统的状态。如果你决定不打印一个文件,你也可以取消一个已经排入队列的打印请求
4.8 lp命令
打印文件排队
分派一个唯一的ID
许多参数在定制路由和打印的时候都是有效的
语法: lp [ -dprinter] [-options] filename …
例子:
$ lp report
request id kp-112 (1 file)
$lp –n2 memo1 memo2
request id is dp-113 (2 files)
$ lp –dlaster –t “confidential” memo3
request –d is laser –114 (1 file)
$
lp命令让用户将文件送往打印队列来打印文件。每个使用lp提交的打印请求都会被分配一个唯一的任务标识号(称为一个请求ID)。
lp会将文件排队打印,或者读取标准输入。
最简单的lp的用法是提供一个文件名作为一个参数,lp会将这个文件送到默认的打印机排队打印。
lp 命令有许多的选项让你可以定制路由和你任务的打印。
lp命令的语法是:
lp [-d dest] [-n number] [-o option] –t title [-w] [file….]
一些lp命令的选项:
-nnumber 文件打印的重复的份数(默认是1)。
-ddest 打印请求会被送到的打印机的名字。
-ttitle 在打印输出的标题页中打印标题。
-ooption 指定你的打印机的具体的选项,例如字体,间距,灰度,等等
-w 在文件打印完成以后,写一条信息到用户的终端。
在上图的第一个例子中,显示lp命令最简单的格式。我们将文件 report送到系统默认的打印机。lp返回一个打印请求的ID和提交给队列的文件的个数。这里, 文件 report 已经被送到打印机 “dp”,打印请求的ID号是 dp-112。
在第二个例子中,我们我们送出两个文件 memo1和memo2到打印机打印,同时我们想要打印两份(-n2)。
在第三个例子中,你可以指定你的打印请求会被送到哪个打印机。打印的输出将被标题为”confidentia” 机密。
5.9 lpstat 命令
语法:
lpstat [-t]
lpstat 报告你已经送往打印机队列的打印请求。
lpstat –t 报告调度表的状态,默认的打印机名,设备,打印机状态,和所有的排队打印的请求。
使用lpstat 命令可以查看lp缓冲系统不同部分的状态。当不加任何参数的时候,lpstat报告你当前送往打印的打印请求。
-t 选项显示系统中的所有的打印机的状态信息。
lpstat –t 命令告诉我们几个事情:
$ lpstat
rw-55 john 4025 Jul 6 14:26:33 1994
$
$lpstat –t
scheduler is running
system default destination: rw
device from rw: /dev/lp2235
rw accepting requests since Jul 1 10:56:20 1994
printer rw now printing rw-54. Enabled sine Jul 4 14:32:52 1994
rw55 john 4025 Jul 6 14:26:33 1994 on rw
rw-56 root 966 Jul 6 14:27:58 1994
sheduler is running 调度表(scheduler)是一个程序,负责将你的打印请求
送往正确的打印机打印。如果调度表没有运行,任何东西都不能打印。
system default destination :rw rw是默认的系统打印机的名字。如果你使用 lp 没有加上 –d printer 的选项,你的打印请求会被送到这台名叫rw的默认的打印机。注意你的默认的系统打印机可能有不同的名字(如lp)。
device for rw:/dev/lp2235  这表明打印机被联结到计算机的缓冲器。
printer rw now printing rw-55 ID为rw-55的打印请求正在被打印。
enabled            打印请求能够在rw上被打印。如果一个打印机是disable你可以提交请求,但是它们不会被打印直到打印机被enabled。
剩下的这些行是被打印的请求。这些字段列出请求的ID,排在哪个用户后打印,打印请求的大小,打印请求生成的时间。
4.10 cancel 命令
语法:
cancel id [id …]
cannel printer [ printer…]
例子:
取消一个由lp命令产生的打印任务。
$ cancel dp-115
取消当前在指定打印机上的打印任务
$ cancel laser
cancel命令被用来从打印队列中删除打印请求。通过取消当前在打印机上的打印任务使下一个打印请求能被打印。你在打印非常长的文件或试图错误地打印一个二进制文件时(例如/usr/bin/cat),你可能会想要取消一个打印请求。请记住,lp 通常打印文本文件。、如果你没有指定合适的选项(例如= oraw(图象打印)),打印其他类型文件的会使打印机混乱,并且会浪费许多的纸张。
要取消一个打印请求,你必须通过给cancel命令一个参数来告诉打印缓冲器那一个打印请求是你想要取消的。cancel的参数有两种类型:
一个请求的ID(lp和lpstat给出的)
一个打印机的名字
通过赋予cannel一个打印请求的ID,指明的哪个打印请求就会被取消。如果你在cancel后面的参数是一个打印机名,当前在哪个打印机上正被打印的任务会被停止,打印队列中的下一个打印请求会开始打印。
$ lpstat
rw-113 mike 6275 Jul 6 18:46 1995
rw-114 mike 3349 Jul 6 18:47 1995
rw-115 mike 3258 Jul 6 18:49 1995
$ cannel rw-115
request “rw-115” canceled
$ lpstat
rw-113 mike 6275 Jul 6 18:46 1995
rw-114 mike 3349 Jul 6 18:47 1995
$cancel rw
request “rw-113” canceled
$lpstat
rw-114 mike 3349 Jul 6 18:47 1995
任何用户都可以执行这个命令取消打印请求,你甚至可以取消其它人的打印请求;然而,被取消请求的用户会收到一个mail,告诉他谁取消了他的打印请求。系统管理员可以限制用户只能取消他们自己的请求。
4.11 cp–拷贝文件
语法:
cp [-i] file1 new_fle 拷贝一个文件
cp [-i] file [file…] dest_dir 拷贝一个文件到一个目录中去
cp –r [-i] dir [dir …] dest_dir 拷贝目录
例子:
$ ls –F
f1 f2* memo/ note memind
cp f1 f1.copy
$ ls –F
f1 f1.copy f2* memo/ note remind
$cp note remind memo
$ ls –F memo
note remind
cp命令被用来制造文件的一个拷贝。以下是使用cp命令的一些注意事项:
要求必须有两个或两个以上的参数:源与目标。
任何一个参数中都可以使用相对和绝对路径名。
当拷贝一个单个的文件的时候,目标可以是一个文件的路径,或是一个目录。如果目标是一个文件,而这个文件又不存在,它会被创建。如果目标文件已经存在,它的内容会被源文件的内容代替。如果目标是一个目录,文件会被拷贝到这个目录下去,同时文件名不变。
-i(interactive)选项会在目标文件已经存在时给你警告,并要求你确认是否覆盖这个文件。
$ cp f1 f1.copy 在当前目录下创建一个叫做f1.copy的文件
$ cp f1 memo 在memo目录下创建一个叫f1的文件
$ cp f1 memo/f1.copy 在memo目录下创建一个叫做f1.copy的文件
当拷贝多个文件的时候,目标必须是一个目录。
$ cp note remind memo
一个文件不能被拷贝成自己。
$ cp f1 f1
cp : f1 and f1 are identical
一个目录可以使用-r (recursive 递归)选项拷贝
注意: 在默认的情况下,cp会覆盖已经存在的文件而不会给出任何提示!
如:
$ cp f1 note
$cat f1
This is a sample file to be copied
$ cat note
This is a sample file to be copied
4.12 mv 移动或是重命名文件
语法:
mv [-i] file new_file 重命名一个文件
mv [-i] file [file…] dest_dir 移动一个文件到一个目录下去
mv [-i] dir [dir…] dest_dir 重命名或是移动目录
例子:
$ ls –f
f1 f2* memo/ note remind
$mv f1 file1
$ ls –F
file1 f2$ memo/ note remind
$mv f2 memo/file2
$ls –F
file1 memo/ note remind
$ls –F memo
file2*
$ mv note remind memo
$ ls –F
file1 memo/
$ ls –F memo
file2* note remind
$ mv memo letters
$ ls –F
file1 letters/
mv 命令被用来重命名一个文件或是移动一个或多个文件到另一个目录中去。以下是使用mv命令时的一些注意事项:
至少要有两个参数: 源与目标。
任何一个参数都可以使用绝对或是相对路径。
当重命名一个单个的文件的时候,目标可以是一个文件的路径或一个目录。如果目标是当前目录下的一个文件,这个文件会被重命名,如果目标是一个目录,源文件会被移动到这个目录。如果文件不存在,文件会被创建。如果目标文件已经存在,它的内容会被源文件所代替,如果目标是一个目录,文件会被移动到哪个目录。
-i(interactive 交互)选项会在目标文件或目录存在的情况下提醒你,并且会要你确认是否覆盖文件或目录。
$mv f1 file1 在当前目录将f1重命名为file1
$mv file1 memo 将文件file1移动到memo目录中去
$ mv f2 memo/file2 将文件f2移动到目录memo,并且改名为file2
当移动多个文件时,目标必须是一个目录。
$ mv note remind memo
当源是个目录的时候,它会被重命名为目标名。
$ mv note letter
注意: 在默认的情况下,mv会移动或重命名已经存在的文件而不给出任何提示。
4.13 ln—链接文件
语法
ln file new_file 链接到一个文件
ln file [file…] dest_dir 链接文件到一个目录
例子:
$ ls –l f1
-rw-rw-r-- 1 user3 class 37 Jul 24 11:05 f1
$ ln f1 /home/user2/f1.link
$ls –l f1
-rw-rw-r-- 2 user3 class 37 Jul 24 11:05 f1
$ ls –l /home/user2
-rw-rw-r-- 2 user3 class 37 Jul 24 11:05 f1.link
$ ls –i f1 /home/user2/f1.link
1789 f1 1789/home/user2/f1.link
链接提供了一种机制:用户可以使用用多个文件名来索引磁盘上的同一物理文件。多个用户想要共享同一个文件的时候可以使用链接的方式,但很多时候用户宁愿选择在自己的目录下有这个文件,因为如果用户3修改了f1,用户2在下一次存取f1.link的时候会看到这些改变。
注释: UNIX系统没有限制多个用户同时存取和修改同一个文件。每一个用户的修改,都会在内存中有一份私有的映象,但是最后存盘的用户会决定磁盘上的文件的版本。有的应用程序会提醒一个用户文件已经被打开,可能限制其他的用户来存取那个已经打开的文件。
当许多的文件被链接到一起的时候,用ls –l 显示出的链接数会比1要大,如果任何一个链接被删除,唯一改变的是链接数会减少,文件的内容不会改变,直到链接数减少到0,在这个时候磁盘的空间也被释放。
例子:
$ ls –l f1
-rw-rw-r-- 1 user1 classs 37 Jul 24 11:06 f1
$ ln f1 /home/user2/f1.link
$ ls –l f1
-rw-rw-r-- 2 user1 classs 37 Jul 24 11:06 f1
$ls –l /home/user2
-rw-rw-r-- 2 user1 classs 37 Jul 24 11:06 f1
4.14 rm – 删除文件
语法:
rm [-if] filename [filename…] 删除文件
rm –r[if] dirname [filename…] 删除目录
例子:
$ ls –F
f1 f2 fruit/ memo/
$rm f1
$ls –F
f2 fruit/ memo/
$ rm –i f2
$f2? <user|y|
$rm fruit
rm: fruit directory
$ rm –r fruit
rm命令被用来删除文件。一旦文件被删除是不可挽回的,rm 命令至少要有一个参数(一个文件名),如果指定的文件名超过一个,所有的指明的文件都会被删除。
以下是最常用的选项:
-f 强制删除文件—用户不会得到任何提示,甚至在发生错误的时候。
-r 递归地删除指定目录中的所有的内容。
-i 询问或交互模式,它会要求用户确认来完成删除。你的回答有y(yes)和n(no),回车的作用和回答no是一样的。
注意: 通常是在极端的情况下才能使用 –r 选项。使用不正确,会删除你的所有的文件,一旦一个文件被删除,只能从备份磁带上恢复这个文件。如果你必须要用 –r选项,请和-i选项一起应用。
例: rm –ir dirname
4.15 文件目录操作命令总结
ls –l    显示文件的特性
cat      在屏幕上联结和显示文件的内容
more     格式化和在屏幕上显示文件的内容
tail     显示文件的结尾部分
cp      拷贝文件或目录
mv      移动或重命名文件或目录
ln      链接文件名
rm      删除文件或目录
lp      将打印请求送到打印机排队打印
lpstat    显示打印缓冲区的状态信息
cancel    取消在打印队列中的打印请求
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:35:42 | 显示全部楼层
[推荐]文件的权限和存取
第五章―文件的权限和存取
目标
完成这一章,你可以做以下的事情:
描述和更改文件的属主和组。
描述和更改一个文件的许可权限。
描述和建立新文件的默认权限。
描述如何更改文件的用户和组的身份。
5.1 文件的权限和存取
存取一个文件需要用户的身份,和与文件相关的权限。这一章会介绍如何存取文件
权限 理解文件的读,写和执行权限
ls (ll,ls –l) 确定文件被赋予的存取权限。
chmod 改变文件的存取权限。
chown 改变一个文件的属主。
umask 改变默认的文件存取权限
chgrp 改变一个文件的组。
su 转换你的用户的身份。
newgrp 转换你的组的身份
每一个文件都属于系统中的一个用户。文件的属主决定谁有权存取这个文件。文件的属主有权力允许或是拒绝其它的用户存取文件。
5.2 谁有存取一个文件的权利
UNIX系统为一个文件提供三层存取结构:
user  代表文件的所有者
group 代表对文件有存取权限的组
other 代表系统中的其他所有的用户
每一个文件都属于系统中的一些用户。文件的属主有完全控制权决定什么人有什么权限存取文件,属主能允许或拒绝其系统中的其他用户存取文件。属主决定什么组有权限存取他的文件,属主也能将文件的所有权转给系统中的其它用户,但是一旦文件的所有权被转换,文件原始的属主不再能够控制这个文件。
由于文件属于用户,并且与组相关联,你可以使用id命令来查看你的身份和你对系统中文件的存取权限。
上图中的文件的属主是用户user3,class组的成员也可以存取这些文件,另外,user3能够允许系统中的其他用户也存取这些文件。
5.3 存取权限的类型
文件和目录有三种类型的存取权限:
read(读)
write(写)
execute(执行)
不同的unix系统命令在存取程序或文件的时候会要求某种权限,例如:cat一个文件,要求要有可读的权限,因为cat命令必须能够读取文件的内容,才能将其显示在屏幕上。类似,在使用ls命令的时候,要求对这个目录要有读的权限,才能够列出目录中的内容。
请注意,存取权限决定于是否你正在存取一个文件或目录。例如,一个文件的“写”的权限意味着文件的内容可以被改变。取消“写”权限会禁止用户改变一个文件的内容。但是并不保护文件不被删除。目录的“写”权限控制一个目录中的内容能否被改变。如果一个目录没有“写” 的权限,它的内容就不会被改变。目录中的文件就不能被删除,添加或是重命名。
注释:想要作为一个程序一样运行一个文件,要求文件要有读和执行的权限。
5.4 权限
你对一个文件的存取权限是在以下部分定义的:你的用户身份,你的组,和与文件关联的权限设置。文件的权限在mode (模式)中指明,文件的模式是一个包含九个字符的字段,其中定义了文件属主的权限,文件所属的组的权限,和其他系统中的用户的权限。
5.5 chmod 改变一个文件的权限
chmod命令被用来更改一个文件或目录的存取权限,只有文件的属主(或root-系统管理员)才能改变权限。
为了保护一个文件不被删除和破坏,文件所在的目录和文件本身一定不能有写的权限。文件写的权限允许用户改变(或是覆盖)文件的内容,如果一个目录有写的权限,会允许用户删除目录中的文件。chmod命令支持一种字母的方式定义文件的权限。
你可以指定你想要更改的权限的类型:
r 读的权限
w 写的权限
x 执行的权限
和你如何更改权限:
+ 增加权限
- 减少权限
= 将权限设置为
你同时可以指明你想要修改哪一组的权限:
u 用户(文件的属主)
g 组(文件关联的组)
o 其他用户
a 所有用户(系统中的每个用户)
none 分配权限给所有的域
注释:想要禁止一个文件的所有的权限,键入以下的命令:
chmod = 文件名
例子:
$ ls -l f1
-rw-r--r-- 1 user3 class 37 Jul 24 11:06 f1
$chmod g=rw,o= f1
$ ls –l f1
-rw-rw-rw- 1 user3 class 37 Jul 24 11:06 f1
$ls –l f2
-rw-rw-rw- 1 user3 class 37 Jul 24 11:08 f2
$chmod u+x,g=rx,o-rw f2
$ls –l f2
-rwxr-x--- 1 user3 class 37 Jul 24 11:-8 f2
chmod命令也支持数值的(八进制)表达式来指定文件的权限。这种表达式十分陈旧,但这是一种十分通用的格式。
要改变文件的权限,你必须将权限的每一个域转变成适当地数字表达式。对属主,组,和其他用户都有存取定义。每种类型的存取赋值可用以下的数字来表示:
read=4
write=2
execute=1
将这些关联到存取权限的数字加起来。
将三个值合起来的数字就是chmod命令的参数。
举个例子,如果你期望的权限:属主是rw-,组是r--,其他是---:
属主 组 其他
rw- r-- ---
4+2+0 4+0+0 0+0+0
6 4 0
因此:chmod命令是:
chmod 640 filename
注意:想要禁止所有的权限,你可以使用一下命令:
chmod 000 file
5.6 umask -权限掩码
语法:
umask [-s] [mode] 用户文件创建模式掩码
例子:
原先默认的权限: rw- rw- rw-
设置默认权限: rw- r-- ---
$umask g=r,o=
[-S]选项以符号的格式显示当前的文件创建的掩码,[-S]选项和符号格式在Bourne 和C shell无效。
选项a-rwx是u-rwx,g-rwx,o-rwx的一个缩写。一个常用的新建文件的默认权限是rw-rw-rw-,这意味着系统中的任何用户都能修改文件中的内容。新建目录的默认权限是rwxrwxrwx,这意味着任何用户能更改这个目录,和删除这个目录中的任何东西。
为了保护你的创建的文件,你可以使用umask命令,这个命令会取消你创建的文件和目录的默认权限设置。组用户的写权限和其他用户的写权限大概是最重要的需要取消的权限。你指定的掩码在你登录系统时一直有效,umask 对已经存在的文件没有任何作用。
5.7 touch - 更新文件的时间标志
touch 命令可以用来创建新文件,空文件。如果指定的文件已经存在,touch会更新文件的时间标志。它对文件的内容没有影响。
touch 命令有以下选项:
-a time 更改存取(Access)时间为指定的时间
-m time 更改修改(Modify)时间为指定的时间
-t time 使用指定时间(time)来代替当前时间。
-c 如果文件不存在,不创建新文件。
例子:
$ touch test_file1
$ ls –l test_file1
-rw-rw-rw- 1 user3 class 0 Jul 24 11:08 test_fiile1
$ umask a-rwx,u=rw,g=r (或 umask 137)
$ umask –S (或 umask)
u=rw,g=r,o= (或 137)
$ touch test_file2
$ ls –l test_file2
$-rw-r----- 1 user3 class 0 Jul 24 11:10 test_file1
5.8 chown 更改文件的属主
语法:
chown owner [:group] filename... 更改一个文件的属主,和可选地,组ID
例子:
$ id
uid=303 (user3), gid=300 (class)
$cp f1 /tmp/user2/f1
$ls –l /tmp/user2/f1
-rw-r----- 1 user3 class 3976 Jan 24 13:13 f1
$ chown user2 /tmp/user2/f1
$ ls –l /tmp/user2/f1
-rw-r----- 1 user2 class 3976 Jan 24 13:13 f1
只有文件的属主和root才能更改一个文件的所有权。
只有文件的属主才能控制文件的属性和存取,如果你想要将一个文件的所有权给系统中的另外一个用户,你可以使用chown命令。例如,user3拷贝他的文件f1给user2。User2对他个人的文件应该有完全的控制权,于是user3将/tmp/user2/f1的所有权转换给user2。可选地, chown可以改变一个或多个文件的组ID。要改变的组可以是一个数字的组ID,或者是一个passwd(group)文件中的登录名。
注意:一旦一个文件的属主已经被改变,只有新的属主或root可以更改文件的所有权和模式。
属主是一个系统认可的用户标识。文件/etc/passwd 中包含有系统中所有用户的ID。
例子:
在上图中,在user3将文件/tmp/user2/f1的所有权转换给user2后,他仍然有读的权限,因为class组中的任何成员对这个文件对都有读的权限。
5.9 chgrp 命令
语法:
chgrp newgroup filename.... 更改一个文件的组。只有文件的属主和root才能更改文件的组。
例子:
$ id
uid=303(user3) ,gid=300(class)
$ ls –l f3
-rw-r----- 1 user3 class 3967 Jan 24 13:13 f3
$chgrp class2 f3
$ls –l f3
-rw-r----- 1 user3 class2 3967 Jan 24 13:13 f3
$chown user2 f3
$ls –l f3
-rw-r----- 1 user2 class2 3967 Jan 24 13:13 f3
长列表中的组域确定什么用户组可以存取这个文件。你可以用chgrp 命令来更改。
new_group(新组)是一个系统认可的组的标识,在文件/etc/group中有系统中所有用户的组ID,
如果指定的新组不存在,chgrp命令不会产生作用。组和组的成员是由系统管理员来控制的
注意:只有文件的属主和root才能更改一个文件的组。
例子:
在上图中,当user3将文件f1的组转变为class2组,他的存取权限没有受到影响,因为他仍然是这个文件的属主。在user3将文件的所有权给了user2,他不再能够存取这个文件,因为user3当前的组是class组。
5.10 su – 转变用户ID
语法:
su [user_name] 更改你的用户ID和组ID
例子:
$ ls –l /usr/local/bin/class_setup
-rwxr-x--- 1 class_admin teacher 3967 Jan 24 13:13 class_setup
$ id
$uid=303(user3), gid=300(class)
$su class_admin
$passwd
$id
uid=400(class_admin), gid=300(class)
$ /usr/local/bin/class_setup
$
退出su对话线程。
$ ctrl + D
su 命令可以用来交互地更改你的用户ID和组ID。 su是switch user 或set user id的一个缩写。这个命令让你开启一个子进程,成为新的用户ID并且赋予你存取与这个用户ID关联所有文件的存取权限。因此,出于安全的考虑,你在实际转换身份时,会被要求输入这个用户帐号的密码。
如果没有参数,su命令将你转换为root(系统管理员)。root帐号有时也被称为超级用户,因为这个用户可以存取系统中的任何文件。也正是这个原因,许多人将su命令看成是supper-user(超级用户)的一个缩写。当然,你必须要提供root密码。
注释:想要回到你原先的用户身份,不要再使用su命令,你只需要使用exit命令退出你使用su命令而生成的新的对话进程。
例子
在上图中,user3没有程序/usr/local/bin/class_setup的存取权限,因为她不是teacher组的成员。如果她输入命令  su class_admin,他就可以存取这个程序。作为用户class_admin,她还可以修改程序 class_setup的内容。当她运行完成这个程序后退出su 的对话,就恢复自己原先的用户状态
su – username
一些配置文件是为你的的对话线索而设立的。。当你使用命令su username时,你的对话特征和你原始的登录身份一样。如果你想要你的对话进程拥有转换后的用户ID一致的特征,你要使用短斜杠: su – username.
5.11 newgrp 命令
newgrp 命令的使用同su 命令相似。这个命令可以更改你的组的ID号。
系统管理员会定义你能转变的组。通过查看文件/etc/group,你能确定你有权改变到那些组。如果你没有被允许成为指定的组的成员,你会得到一条信息:Sorry.
由于newgrp命令没有开启一个新的对话线索,你只需要使用newgrp来回到你最初的组的状态。
例子:
在以上的图中,user3仍旧无权存取程序/usr/local/bin/class_setup,因为他被初始化定义为组class中,user3能 newgrp teacher到teacher组,因为系统管理员已经赋予属于他teacher的一员。现在他可以允运行这个程序,因teacher组的所有成员对为这个程序都有执行权限,但是他不能更改这个程序的内容,只有用户class_admin可以更改这个程序。当user3完成他的工作,他可以再次使用newgrp回到他原始的组状态。
/etc/group文件的例子:
teacher: : 33: class_admin,user3
class: : 300 :user1,user2,user3,user4,user5,user6,class_admin
5.12 文件权限和存取-总结
关于文件权限需要注意的有:
文件的路径名中指出的所有的目录必须要有执行的权限,否则文件不能得到存取。
要保护一个文件不被其它人修改或者删除,可以取消文件和文件所在目录的写的权限。
只有文件的属主(或root)才能更改文件模式(chmod),所有权(chown),和文件
的组(chgrp)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:38:49 | 显示全部楼层
[推荐]shell基础
第六章:shell基础
目标
完成这一章,你能够作以下事情:
了解shell的工作原理
描述用户登录的过程
描述用户环境变量和这些环境变量的功能。
设置和修改shell变量。
了解和修改一些特殊的环境变量例如PATH ,TERM等等。
为特定的应用定制用户环境变量。
6.1 什么是shell?
shell是一个交互性命令解释器。Shell独立于操作系统,这种设计让用户可以灵活选择适合自己需要的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。
这一章介绍POSIX shell提供的交互的特征。
以下是shell功能的一个汇总:
查找命令的位置并且执行相关联的程序
为shell变量赋新值
执行命令替代
处理 I/O重定向和管道功能
提供一个解释性的编程语言界面,包括tests,branches 和loops等语句
当你登录到一个unix系统,shell会为你的终端登录线索定义一些特征,然后出现你的提示符。在POSIX,Bourn,K shell中$符号为默认的提示符。C shell中默认的提示符是%号。
6.2 一些通常使用的shell
/usr/bin/sh     POSIX shell
/usr/bin/ksh     Korn shell
/usr/old/bin/sh   Bourne shell
/usr/bin/csh     C shell
/usr/bin/keysh    A contest-sensitive softkey shell
/usr/bin/rksh    Restricted Korn shell
/usr/bin/rsh     Restricted Bourne shell
POSIX shell 、是一个POSIX兼容的命令编程语言和命令解释器。它可以从终端或者是一个文件中读取并且执行命令。POSIX在许多方面同korn shell 相似。有历史机制。支持任务控制,和其他有用的特性。
Korn shell 同POSIX shell十分类似,是由贝尔试验室的David Korn开发的。
Bourne shell :缺乏许多在POSIX,和korn shell 中的功能。它是由Stephen R. Bourne开发的,是AT&T unix中最先使用的shell
C shell。是一个普通的语言解释器,有命令历史机制,类似C语言的语法。和任务控制工具。它是由university of California at Berkeley 的william Joy开发的。
Rsh 和rksh是Bourne shell 和Korn shell 的受限制的版本。受限制的shell在设置登录名和环境的时候比普遍的shell 有更多的限制。受限制的shell使用起来就象是具有异常现象的标准的shell。
使用受限制的shell的用户不能:
更改目录
重新设定PATH变量的值
在路径名中使用/符号。
重定向输出。
6.3 POSIX shell的特性
POSIX shell 是unix提供的shell中的一个。这种shell有许多Korn shell拥有,但Bourne shell没有的特征。即使你不会使用到所有的高级特征,你仍然会发现POSIX shell 是一个非常方便的用户界面。以下是POSIX shell的一些特性:
命令的历史机制。
命令行重调用和编辑
任务控制。
文件名自动完成。
命令的别名。
增强的cd。
先进的编程能力。
6.4 别名
别名就是命令的一个新的名称。使用别名可以缩短长命令行输入,创建新的命令,或用一种称为别名的新的命令来替代原始的命令执行。别名的组成可以是一个字母或一个短的单词。例如,许多的人非常频繁地使用ps –ef 命令。如果你使用psf代替这个命令是否会更容易一些?你使用alias命令可以创建别名:
$ alias name= string
在这里,name是你要取的别名,而string是name要取代的命令或者字符串。如果string包括有空格,你要需用引号将整个字符串括起来。别名对于减少键盘输入,减少打字错误,或是创建新的命令会很方便。
别名在使用的时候和其他的命令一样。 执行一个真的的unix系统命令和执行引用到一个unix命令的别名对于用户来说是透明的,没有任何区别。
别名经常用于全路径名的一个缩写。
如果不带差数,alias命令会报告当前定义的所有的别名。
想要列出一个特定的别名,使用alias name命令。
禁止一个别名,可以使用unalias命令,语法是:
unalias name
例子:
$ alias go=’cd’
$ alias there = /home/user3/tree/ford/sports
$ go there
$pwd
/home/user3/tree/ford/sports
6.5 文件名自动完成
例子:
 $ more fra esc esc
 $ more frankenstein
 .
 .
 .
 $ more abc esc esc
 $ more abcdef esc =
 1)abcdefx1mnop
 2)abcdefy1mnop
  $ more abcdef
然后打x或y,然后连续按两下esc键
系统就会自动完成相关联的文件名。
当你想要存取一个长文件名的时候,你可以使用文件名自动完成功能,如果你输入的字符足够多,能唯一标识一个文件名后,你可以连续敲两下esc键, POSIX shell就会自动补全文件名的剩余部分。如果输入的字符串并不唯一,POSIX shell 就不能解析到文件名,你的终端会发出蜂鸣。
直到没有文件名冲突时候,连续敲两下esc键,shell会自动完成文件名。你也可以通过敲一下esc键来列出所有可能的文件名。在 POSIX shell列出了有效的选项的时候,你就能够使用编辑命令来增加后来的字符来唯一地确定你所需要的文件名,然后你可以连续敲两下esc键来完成文件名。
文件名自动完成可以在所有的使用文件名路径的时候使用,例如:
$cd tr esc esc do esc esc r esc esc
会显示以下的命令行:
$cd tree/dog.breeds/retriever
6.5 命令的历史机制
语法:
history [-n| a z] 显示以前输入的命令。
例子:
$ history –2 列出最近输入的两个命令
cd
more .profile
$ history 3 5 列出命令号从3到5的所有的命令
date
pwd
ls
POSIX shell保留一个历史文件来存储你所键入的命令,你可以重输入这些命令。这个历史文件会在你登录时建立,在退出登录时被删除。
history命令会显示你最近输入的16个命令,每一个命令前面都会有一个命令号。你可以通过这个命令号来引用你以前键入的命令。
你可以键入history –n 来显示少于或者多于16个命令。其中n代表命令号。
你可以键入history a z 来显示一个命令号的范围。其中a z代表命令号的一个范围。
HISTSIZE变量定义了保存的的历史命令的数目。(默认值是128)HISTFILE变量定义了保存历史命令的文件的一个文本文件名(默认值是.sh_history).
6.6 重新输入命令
你可以通过简单地键入
r c
来从命令历史中运行任意的命令。
其中c 代表命令号。你也可以键入命令的第一个字母来执行你最近键入的命令,例如:
$ history
1 date
2 cat file1
3 ls –l
$ r d
Mon Jul 4 10:03:13 1994
6.7 用户环境
语法:
env
例子:
$ env
HOME=/home/gerry
PWD=/home/gerry/develop/hasics
EDITOR=vi
TERM=70092
......
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin:/home/gerry/bin
用户环境记录了关于用户程序的线程的许多信息。 你的环境中的信息有:
你home路径的路径名
电子邮件的存放地址
你所在地的时区
你登录的用户名
shell查找命令的路径
终端类型
你的应用可能需要的其他东西。
例如:命令vi和more 需要知道你的终端类型才能以正确的格式输出数据。
与用户环境类似的是你的办公环境。在办公室里的灯光,声音,和温度对所有的工作者都是相同的。而其他的对你来说唯一的因素组成了你的特殊的环境。这些因素包括你正在执行的工作,你的写字台的布局,和你和办公室其他人的关系。你的工作环境就像你的用户环境一样都是唯一的。
许多应用需要你按照一些方式来定制你的环境。这种定制是通过修改你的.profile文件来完成的。
你可以运行env命令来检查你的环境。这个命令会显示你的环境中的每一个变量和变量的值。
每一个环境变量的设置都有一个的意义,以下是一些普通的环境变量和它们的含义:
TERM,COLUMNS,LINES    你使用的终端的类型。
HOME           你的home目录的路径
PATH           查找命令的位置的一个目录的列表。
LOGNAME         登录时使用的用户名
ENV,HISTFILE       特殊的POSIX shell 变量
DISPLAY         特殊的x windows 变量
在这些变量中,一些是系统设置的变量,其他都是在/etc/profile 或.profile中设置。
6.8设置SHELL变量
shell变量是一个名称,代表一个值
与这个名称管关联的值可以被修改
一些shell变量是在登录的过程中定义的。
用户可以自己定义新的shell变量
语法:
 name=vales
例子:
 $ PATH=/usr/bin/X11:/usr/bin
shell 变量同代数中的变量很相似。它是代表一个数值。给一个变量赋值就是将一个数值分配到一个变量名上。然后就可以通过这个变量名来存取这个数值。如果这个值被修改,仍然能够通过变量名来存取新的值。给shell变量赋值的语法是:
name=value
你可以在终端的shell提示符下输入,或者在shell脚本中加入这条语句。注意,在等号(=)的前后都没有空格。区别shell变量的名称和shell变量的值十分重要。当一个赋值语句执行的时候,变量的值才会被设定
例如
TERM=70092
这会告诉shell记住TERM这个名称,并且在TERM变量的值被要求的时候,返回70092。
变量名限制
变量名必须由字母开始可以包含字母,数字。下划线,变量名所包含的字符的数量没有限制。
6.9 两个重要的变量
PATH变量
  -shell搜寻你键入的命令所在位置的一个目录的列表
TERMb变量
  -描述你的终端类型和屏幕尺寸(为你运行的程序需要)
 $ env
 ...
 PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
 $TERM=70092
 $
 $ tset
 Erase is Backspace
 kill is Ctrl+U
 $
PATH变量 是shell在寻找命令所要查找的路径的一个列表。它使我们可以简单地键入一个命令名而不需要在前面加上一个完整的一个路径列表。(例如,vi代表/usr/bin/vi)。以下是一个默认的PATH变量的例子:
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
这意味着当你键入一个命令的时候,shell会在路径/usr/bin中查找,然后是/usr/contrib/bin,等等,直到找到这个命令,或者找完这些目录都没有发现这个命令。如果没有找到这个命令,会有一个 command: not found的错误信息出现在屏幕上。
TERM是一个描述你的终端类型的环境变量。为了许多的命令能正确运行,它们需要知道你使用的终端类型。例如,ls 命令需要屏幕有多少列,更多的需要知道屏幕有多少行,vi为了正确地工作,同时需要知道你的终端的行与列的数目和关于你的终端更多的信息。终端的类型被设置成为终端的型号的数字。(例如 2392,70092,等等)
设置终端变量的默认方法是使用以下的方法:
TERM=(hp)
你的系统管理员也许已经设置好你的系统,所以系统不会询问你的终端类型。在这种情况下你可以使用env命令来检查TERM环境变量的值。如果你使用的工作站只有一个显示器,TERM变量的值就很可能是正确的,不需要更改。
如果你的终端在你使用more 或者vi 的时候出现异常,请检查TERM变量,如果设置正确,执行tset命令。这个命令会使用TERM变量中的值来重新设定你的终端类型。
6.10 常用的变量赋值
黑体字为你要定义的变量。
EDITOR=/usr/bin/vi      使用vi作为行编辑器
ENV=$HOME/.shrc        在shell启动的时候执行$HOME/.shrc文件
FCEDIT=/usr/bin/vi      在先前的命令行开始vi编辑线索。
HOME=/home/user3       指明你的登录的目录
~(波浪符号)           在POSIX shell中等同于你的HOME目录
HISTFILE=$HOME/.sh_history  存储所有的键入的命令的文件
LOGNAME=user3         指明你的登录标识或是用户名。
MAIL=/var/mail/user3     指明你的系统邮箱
OLDPWD=/TMP          指明你所进入的前一个目录
PATH=/usr/binHOME/bin   指明查找命令的路径。
PS1=              指明你的主提示符。
  PS1=’[!] $’           在提示符中显示命令的行号
  PS1=’$PWD $’           在提示符中显示当前的工作路径(注                            意:必须使用单引号。
  PS1=’[!] $PWD $’         在提示符中显示行号和当前工作目录
PWD=/home/user3/tree    指明你的当前所在的目录。
SHELL=/usr/bin/sh      指明你的命令解释程序
TERM=2392a          指明你使用的终端的类型,启动的时候使用命令eval ‘tset –s                 –Q –h ‘系统会自动读取/etc/ttytype文件,并使用恰当地终               端类型来映射你的终端的端口。这在你的系统联接有不同型号的               终端的时候十分有用。
TMOUT = 300         如果在指定的时间内没有命令或回车键入,shell会中止                   或者超时
TZ=EST5EDT         定义系统时区以显示正确的时间
6.11 在登录的时候发生了什么?
当你坐下来开始在系统中工作,你会在屏幕上看见login: 提示符。当你键入你的用户名,系统会读取你的用户名,并且提示你输入密码。当你键入你的密码,系统会检查你的用户名和密码(使用/etc/passwd文件)。如果你键入的用户名和密码是正确的,系统会让你进入到你的home目录,并且系统会为你启动shell。我们已经看到了每一次我们登录的时候发生的事情。我们的问题是-当shell启动的时候,系统究竟做了什么?
1 getty
a. 显示/etc/issue中的内容
b.出现登录提示符
c.运行登录过程
2.Login
 a.确认用户名和密码的正确性。
 b.将用户放在home目录下
   c.运行用户的shell
3. shell
 a. 执行/etc/profile文件(POSIX,Bourne,和Korn shell) 或者是/etc/csh.login(C shell)
 b. 执行用户home目录下的.profile 或者.login文件
 c. 执行用户home目录下的.kshrc文件(POSIX和Korn shell)。如果用户创建了这个文 或是   在ENV变量中设置.kshrc在.profile文件中。
 d.出现shell提示符
一旦shell开始运行,他会从系统命令文件/etc/profile中读取命令执行.用户无论在什么时候登录和启动一个shell,这个文件都会被读取,然后shell会读取你自己的.profile文件。这两个shell脚本被用来定制一个用户的环境。
/etc/profile中设置了系统中每个用户的基本的环境。而.profile文件更多的是定制你特殊的需要。因为每一个人都会使用/etc/profile文件,所以系统管理员有责任维护这个文件。
当这两个程序都完成后就会出现shell提示符。
6.12 shell启动文件
Korn(/usr/bin/ksh)         .profile
                    .kshrc

Bourne(/usr/old/bin/sh)       .profile

POSIX(/usr/bin/sh)          .profile
                   .kshrc
Restricted(/usr/bin/rsh,     .profile
/usr/bin/rksh)
C(/usr/bin/csh)           .profile
                   .cshrc
系统在配置你的线程的时候通常需要一些环境变量(例如:PATH,EIDTOR.)。正如你已经看到的,它们必须在你每次登录的时候定义。. profile文件和.kshrc文件十分有效。它们是简单的shell脚本文件,可以用来定制你的环境变量,定义别名,在登录时执行程序。由于 POSIX shell 是起源于Korn shell,而Korn shell又是起源于Bourne shell,所以,POSIX shell 支持同样的配置文件。
.profile
任何想要定制由系统管理员提供的默认环境的用户都可以创建或修改.profile文件。这个文件通常定义或定制了环境变量,设置用户的终端,在登录过程时执行如date这样的程序。用户的应用同样也可以通过在.profile中的exec applicationname来启动。在这种方式下,用户不会存取到shell提示符,并且,当应用程序退出,用户同时会退出登录。
/etc/profile
这个文件是一个对系统中的所有用户都有效的初始化文件,前提是这些用户使用的是Bourne,Korn,或者POSIX shell.。系统管理员可以定制这个文件来提供所有的用户的一个一致的用户环境。普通的用户一般没有权限更改这个文件,用户定制他们自己的环境
只能通过自己的.profile和.kshrc文件
.kshrc
POSIX和K shell都有一个可选的叫做.kshrc的配置文件。它的作用同.profile一样是配置你的用户环境,同.profile不同的是,.kshrc是在每次你启动一个新的shell时被读取。而不仅仅是在登录的时候。这种方式允许在每次你启动一个新的shell地时候设置你的别名或甚至提示符。在象X11 windows这种环境中,你可能同时运行几个shell,你可以使用.kshrc文件,这样,每一个shell看上去都是一样的。
.kshrc这个文件名不是一个必须的文件名。当你激活一个shell,它会通过ENV这个变量来索引这个文件。这个文件通常都是.kshrc,但它也可以使用其他的名字。
ENV=~/.kshrc
export ENV
这会告诉K shell你使用你的home目录下的.kshrc文件,现在就可以在..kshrc中加入你的别名和命令。
如果你同时使用Bourne 和POSIX shell,你可以存储POSIX shell的环境变量到这个文件中,因为Bourne shell不会读这个文件。
.cshrc 和 .login
当你使用C shell作为你的登录的shell的时候,C shell 会在你的home 目录下找一个.login地文件。如果找到,在shell提示符出现之前,这个文件中的命令就会被执行。这和POSIX,Korn,和 Bourne shell中的.profile的用法完全一样。如果文件存在,文件.cshrc中的命令也会被执行。
6.13 shell内部命令和unix命令
shell内部命令是内建在shell中的命令
例如:
 cd
 ls
 pwd
 echo
unix命令存在在/usr/bin下。
例如:
 more
 file
一些“内部”命令同样可以作为“单独”的命令使用。
系统使用PATH变量来确定UNIX命令的位置
一些通过键盘键入的命令是系统中的一个文件,例如在/usr/bin下的文件,这些命令都是unix命令,但由于许多的命令,如 cd ,pwd , echo 实际上是shell内部自带的命令。这些命令在unix文件系统中并不存在,这些命令就叫做shell内部命令。
由于unix命令可能存在在几个目录下,shell必须知道到什么地方去找这些命令。PATH变量就是shell查找命令的目录的位置。
unix命令可以与shell内部命令同名,为了使用这些命令,用户必须在这些命令前加上其绝对路径名,以免同同名的内部命令冲突。
6.14 命令的查找-whereis
UNIX命令主要存在在四个目录:/sbin,./usr/bin,/usr/local/bin,和/usr/contrib/bin。 whereis 命令主要在这些目录下查找命令所在的位置。许多的用户在他们的登录目录下有自己的bin 目录。whereis 命令不会去查找这些路径。有时你忘记命令的路径和命令的手册的位置。UNIX系统通过whereis 命令来定位命令和手册在系统中的位置。
whereis 命令接受单一的参数就是命令的名字。它返回的结果是可执行代码的位置和命令的手册页
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:41:09 | 显示全部楼层
[推荐]shell高级特性
第七章:shell高级特性
Shell 高级特征
目标
完成这一章,你可以做到以下事情:
使用shell的替代功能,包括变量替代,命令替代,和波浪号替代。
设置和修改shell变量。
将局部变量传给环境。
使变量对子进程生效。
解释进程是如何被创建的。
7.0 shell 的替代功能
在shell 中有三种类型的替代:
变量替代
命令替代
波浪号替代
替代的作用是加速命令行的键入和执行
7.1 Shell 变量存储
Shell内有两块内存区域用于存储shell变量,它们是:局部数据区域和环境。当定义了一个新的变量时,内存会被分配给局部数据区域,在这个区域中的变量是当前shell 私有的,通常称为局部变量,任何以后的子进程都不会存取到这些局部变量。但是,子进程能够存取那些传送到环境中去的变量。
在你的登录进程过程中,有几个特殊的shell变量会被定义。其中大多数的变量存储在环境中:一些变量,例如 ps1 和ps2,存储在局部数据区域。这些变量的值能够被改变,用于定制你的终端特性。
env 命令能够显示当前保存在环境中所有的变量,例如:
$ env
MANPATH=/usr/share/man: /usr/contrib/man: /usr/local/man
PATH=/usr/bin: /usr/ccs/bin:/usr/contrib/bin: /usr/local/bin
LOGNAME=user3
ERASE=^H
SHELL=/usr/bin/sh
HOME=/home/user3
TERM=hpterm
PWD=/home/user3
TZ=PST8PDT
EDTOR=/usr/bin/vi
7.2 设置Shell变量
语法: name=value
例子:
$ color=lavender             给一个局部变量赋值
$ count=3                 给一个局部变量赋值
$ dir_name=tree/car.models/ford    给一个局部变量赋值
$ PS1=hi_there             更改环境变量的值
$ set                   显示所有的变量和值
当一个用户创建了一个新的变量,例如 color ,这个变量会存储在局部数据区域中。当给一个已经存在的环境变量赋予一个新值,例如 path ,这个新值会代替环境中的旧的值。
7.3 变量替代
语法:
$ name      执行一个变量替代
例子:
$ echo $PATH
/usr/bin:/usr/contrib/bin:/usr/local/bin:/home/user3:.
$ echo $HOME
/home/user3
$ file_name=$HOME/file1
$more $file_name
<contents of /home/user3/file1>
每一个变量都有一个关联值。当使用“$变量名”来对这个变量进行引用时 ,shell 会用变量的值来代替这个参数。这个过程被称为变量替代,这是 shell在执行输入的命令前执行的任务之一。在shell 完成了所有的命令行的变量替代后,就会开始执行这个命令。因此,变量可以代替命令,命令参数,或者一条完整的命令行。这提供了一种机制来方便用户重命名哪些经常使用的长的路径名,或长的命令字符串。
例子:
上例示范了一些shell变量的用法。请注意,变量替代能够出现在命令行的任何位置,在一个命令行中可以有多个变量。如上例所示,一个已经存在的变量的值能够用来更新当前变量的值。
$ echo $PATH
/usr/bin:/usr/contrib/bin:/usr/local/bin
$ PATH=$PATHHOME:.
$echo $ PATH
/usr/bin:/usr/contrib/bin:/usr/local/bin:/home/user3:.
$ echo $HOME
/home/user3
$ file_name=$HOME/file1 file_name=/home/user3/file1
$ more $file_name more /home/user3/file1
<contents of /home/user3/files1>
echo $name 命令是用于显示变量当前的值最常用的方法。
{} 的用法
确认你有一个叫file和一个叫file1的变量。能够使用以下的语句给它们赋值:
$ file =this
$ file1= that
$echo $fileand$file1 寻找变量fileand,file1
sh: fileand: parameter not set
$ echo ${file} and $file1 寻找变量file,file1
thisandthat
花括号被用来区分变量名和周围的文本。
7.4 变量替代(2)
$dir_name=tree/car.models/ford
$echo $dir_name
tree/car.models/ford
$ls –F $dir_name
sedan/ sports/
$ my_ls =”ls –aFC”
$ $my_ls
./ file.1 tree/
../ file.2
$ $my_ls $dir_name
./ ../ sedan/ sports/
$ cd /tmp
$ dir_name=/home/user2/tree/dog.breeds/retriever
$ $my_ls $dir_name
./ ../ golden labrador mixed
在指定一个文件或目录时,使用一个绝对路径作为一个变量的值。会让你在文件系统的任何位置都可以存取你想要的文件或目录。
上例的解释如下:
$dir_name= tree/car.models/ford
$ echo $dir_name        echo tree/car.models/ford
tree/car.models/ford
$ ls –F $dir_name       ls –F tree/car.models/ford
swdan/ sports/
$ my_ls = “ls –aFC” 使用引号让shell 忽略空格
$ $my_ls            ls -aFC
./ file.1 tree/
../ file.2
$my_ls $dir_name        ls –aFC tree/car.models/ford
./ ../ sedan/ sports/
$ cd /tmp
$ dir_name=/home/user2/tree/dog.breeds/retriever
$ $my_ls $dir_name       ls –aFC /home/user2/tree/dog,breeds/retriever
./ ../ golden labrador mixed
7.5 命令替代
语法:
$(command)
例子:
$pwd
/home/user2
$ curdir=$(pwd)
$ echo $curdir
/home/user2
$ cd /tmp
$ pwd
$ cd $curdir
$ pwd
/home/user2
命令替代用来替代一个命令和命令行输出。命令替代的标准语法,也是POSIX鼓励的一种语法是:$(command).
命令替代让你捕获一个命令的输出,用它作为另一个命令的参数,或是赋值给一个变量。象在变量替代中一样,命令替代的执行是在命令行开始之前完成的。当命令行输出包含回车换行,它们会被空格代替。
同变量替代相似,命令替代使用一个美元符号之后的用括号包围的一个命令。
所有有效的shell脚本都可以加入命令替代。Shell 扫描每行脚本,执行它发现的开始于一个开括号,结束与于一个闭括号的命令。
命令替代的另外一种格式是用单引号来环绕一个命令象:
‘command’
它和$(command) 是等价的,并且这是Bourne Shell认证的唯一的形式。’command’形式可以用在POSIX的脚本中和Bourne Shell的脚本中。
命令替代通常是在将一个命令的输出赋给一个变量或以后的处理时使用。通常pwd命令将它的输出送到你的屏幕。当你执行以下的赋值语句:
$ curdir=$(pwd) 或 $ curdir='pwd’
pwd 的输出被赋给变量 curdir。
7.6 波浪号替代
$ echo $HOME
/home/user3
$ echo ~
/home/user3
$ cd tree
$ echo $PWD
/home/user3/tree
$ ls ~+ /dog.breeds
collie poodle
$ehco $OLDPWD
/home/user3/mail
$ ls ~-
/home/user3/mail/from.mike /home/user3/mail/form.jim
$echo ~tricia/file1
/home/tricia/file1
如果一个单词以一个波浪符(~)开头,这个单词被执行一个波浪符扩充,注意波浪符扩充只在一个单词的开始才会起作用,这个意思是:/~home/user3 没有波浪号扩充的功能,波浪扩充有以下的规则:
单个地波浪号或是在/ 之前代表HOME变量中设置的路径名。
一个波浪号跟一个+号代表PWD变量的值。PWD的值是在cd 到一个新的,当前的,工作目录时被设定的。
一个波浪号跟一个-号会代表OLDPWD变量的值。OLDPWD变量是在cd 前一个工作目录时被设定的。
如果一个波浪号跟一个字符串,然后是一个/ 符号 ,shell 会检查字符串是否与用户在系统中的名字一致。如果一致,~字符串会被用户登录的路径名所代替。
波浪符号也能在别名中引用:
$pwd
/home/user3
$alias cdn=’cd ~/bin’
$ cdn
$pwd
/home/user3/bin
7.7 显示变量的值
$ echo $HOME
/home/user3
$env
HOME=/home/user3
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
SHELL=/usr/bin/sh
$ set
HOME=/home/user3
PATH=/usr/bin:/usr/contrib/bin:/usr/local/bin
SHELL=/usr/bin/sh
dolor=lavender
dir_name=/home/user3/tree
$ unset dir_name
变量替代,($变量),可以被用来显示一个独立变量的值,无论这个变量是在本地数据区域或是在环境中。
env 命令用来显示所有的当前环境中的定义的变量,和它们的值。
set 命令会显示所有的当前定义的变量,本地和环境中的变量,和它们的值。
unset 命令用来删除指定变量的当前的值。这个指被赋为空值 NULL。
set 和unset 都是shell内建的命令,而env 是UNIX命令 /usr/bin/env.
7.8 传送局部变量到环境
语法:
export 变量 传递变量到环境
传送变量 color和 count 到环境的过程,执行了以下的命令:
$ color=lavender
$ export color
$ export count=3
$ export
export PATH=/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/usr/local/bin
export color=lavender
export count=3
为了使其它的进程也能使用一个变量,这个变量必须在环境中存在。当一个变量被定义,这个变量存储在局部数据空间,必须被export 到环境中去。
exprot 命令将指定的变量从局部数据空间传递到环境数据空间,export 变量=值 会对变量进行赋值(也可能是更新),同时将这个变量放到环境中去。如果不带参数,export 命令同env命令一样会显示所有exported(输出的),变量的名字和值,注意 export 是一个shell 内部的命令。 
7.9 传递变量给一个应用
系统中的每一个应用或命令都会有一个相关联的存储在磁盘上的程序文件。大多数的UNIX系统命令在目录/usr/bin 下面。当执行一个命令的时候,命令相关的程序文件必须被定位,再将代码装载入内存然后执行。在UNIX系统中一个运行中的程序被称为进程。
当你登录进入一个UNIX系统时,shell 程序会被装载,一个shell 进程会被执行。当你在shell提示符下输入一个应用的(或命令)的名字后,一个子进程会被创建和执行:其过程如下:
一个fork(分叉)系统调用会复制你的shell进程,包括程序代码,环境数据空间,和局部数据空间
一个exec系统调用 会使用子进程的代码和本地数据空间来替代原进程的本地数据空间。
exec 会在执行要求的应用进程后结束。
当子进程在执行的时候,shell (父进程)会进入睡眠状态,等待子进程结束。一旦子进程结束执行,它会中止,释放自己使用的内存,并且唤醒父进程,父进程又可以准备接受另外的命令请求,当shell 提示符返回到屏幕上,你就知道子进程已经结束。
局部变量和环境变量
无论何时定义一个新的变量,它都会存储在于与本进程相联系的局部数据空间中。如果一个子进程想要存取这个变量,这个变量必须被传送到环境中(使用export),一旦一个变量在环境中,它对每个后来的子进程都会有效,,因为环境变量对每个子进程都有效。
在上图中,在vi 命令之前,color 变量在shell的局部数据空间里,TERM 变量在环境里。当vi 命令执行时,shell执行一次 fork 和exec;子进程的局部数据空间比子进程的程序代码所覆盖,但环境被完整地传递给子进程。因此,子进程 vi 不能存取变量 color,但是它可以存取变量TERM。Vi 编辑器需要知道用户的终端类型,用来适当地格式化它的输出。它通过读取环境变量TERM的值来获得这些信息。
唯一的传递数据给(子)进程的方法是通过环境变量。
7.10 监视进程状态
$ ps –f

UID PID PPID C STIME TTY TIME COMMNAD
user3 4702 1 1 08:46:40 ttyp4 0:00 -sh
user3 4895 4702 18 09:55:10 ttyp4 0:00 ps -f
$ ksh
$ ps –f
UID PID PPID C STIME TTY TIME COMMAND
user3 4702 1 0 08:46:40 ttyp4 0:00 -sh
user3 4896 4702 1 09:57:20 ttyp4 0:00 ksh
user3 4898 4896 18 09:57:26 ttyp4 0:00 ps –f
$exec ps –f
UID PID PPID C STIME TTY TIME COMMAND
user3 4702 1 0 08:46:40 ttyp4 0:00 -sh
user3 4896 4702 18 09:57:26 ttyp4 0:00 ps –f
$
系统中的每一个进程在启动的时候都被赋予一个唯一的号码,这个号码被称为进程ID(PID)。Ps 命令显示当前在你系统中运行(或睡眠)的进程的信息,包括每个进程的PID,每个进程父进程的PID(PPID)。通过PID 和PPID,你能够追踪你系统中任何进程的体系。Ps命令同时也会报告每一个进程的属主,终端号,和其他的有用的信息。
ps 命令通常不带参数使用,结果是给出一个与你当前终端对话相关的进程的一个简单的报表,例如:
$ ps
PID TTY TIME COMMAND
ttyp4 0:00 sh
ttyp4 0:00 ps
正如你看到的那样,这个命令显示只有shell, sh,和 ps 命令正在运行。注意两个进程的PID号码。当使用-f 选项时候,ps 命令给出一个全列表,包括PPID号,我们可以看到ps –f 命令是作为shell的一个子进程,因为它的PPID号同shell的PID号是一致的。
请记住shell 同其他的UNIX命令一样都是一个程序。如果你在当前的POSIX shell 的提示符下使用ksh 命令,一个fork 和 exec会执行,一个Korn shell的子进程会被创建,并开始执行。当我们执行另一个 ps –f 的时候,我们可以发现,ksh 作为原来的 shell,sh 的一个子进程运行,新的ps 命令作为Korn shell的一个子进程。
exec命令是一个shell内建的命令。如果用我们用 exec ps –f 来代替ps –f ,ps 的程序代码会覆盖当前的进程(ksh)的程序代码。很明显,这是因为ps –f 的PID号与ksh 使用的PID是一致的。当ps –f 结束后,我们会发现回到了最初的POSIX shell  提示符。
7.11 子进程和环境
例子:
$ export color=lavender

$ ksh (创建一个子shell进程)
$ ps -f
UID PID PPID C STIME TTY TIME COMMAND
user3 4702 1 0 08:46:40 ttyp4 0:00 -sh
user3 4896 4702 1 09:57:20 ttyp4 0:00 ksh
user3 4898 4896 18 09:57:26 ttyp4 0:00 ps –f
$ echo $color
lavender
$ color=red
$ echo $color
red
$ exit (退出子shell)
$ ps –f (回到父shell)
UID PID PPID C STIME TTY TIME COMMAND
user3 4702 1 0 08:46:40 ttyp4 0:00 -sh
user3 4895 4702 1 09:58:20 ttyp4 0:00 ps –f
$echo $color
lavender
上例说明了子进程不能够更改它们的父进程的环境。
$ ps –f
UID FSID PID PPID C STIME TTY TIME COMMAND
user3 default_system 4702 1 0 08:46:40 ttyp4 0;00 -sh
user3 default_system 4895 4702 1 09:58:20 ttyp4 0:00 ps –f
如果最初执行一个ps –f 命令,它会显示只有你的登录shell(当然还有ps )在运行。如上表中,我们给一个变量color 赋值 lavender,然后将这个变量传递到环境。下一步,我们执行一个子进程。执行一个ksh命令,创建一个子Korn shell进程。当然父进程的环境已经传递给这个子Korn shell进程,我们可以观察到变量color的值是lavender。我们然后更改变量color的值为red。echo命令确认在子shell的环境中变量color的值已经被改变。当我们退出子shell回到父shell,我们发现父进程的环境并没有被子进程改变,变量 color仍然保持原来的值lavender.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:43:43 | 显示全部楼层
[推荐]引用
第八章:引用
目标
完成这一章,你能够做以下事情:
在命令行中使用引用机制来忽略特殊字符的特殊含义
8.1 介绍引用
许多的字符在shell中有“特别”的含义:
- 空格
- 回车
- $
- #
- *
- < >
引用会消除(忽略)这些字符的特殊含义。
在unix系统中,有些特殊字符对shell有特殊含义,例如,空格是命令和参数的分割符;回车会发送给shell执行命令的信号,$符号被用来显示与变量名相关联的值。
在一些特殊的情况下,你不想要shell理会这些字符的特殊含义,你只要求保留字面上的意义,因此unix必须提供一种机制来忽略或消除指定的字符的特殊含义,这种机制就叫做引用。
8.2 引用符号
反斜杠 单引号 ‘
双引号 “
反斜杠会消除紧跟在它后面的特殊字符的特殊意义。
单引号(’)会消除特殊字符的特殊含义。在单引号包围之中的所有的特殊字符的特殊含义都会被忽略。单引号本身不能被忽略,因为它要被用来关闭被引用的字符串。
双引号(”)的包容性要差一点,双引号可以去除大多数的特殊字符的特殊含义,只有$符号(当其被用来作为变量和命令替代的时候),和反斜杠例外。所以你可以在双引号中使用反斜杠来除掉 $号的特别含义。
8.3 引用-- 语法:
\   除去下一个字符的特别含义
例子:
$ echo the \ \ escapes the next character
the \ escapes the next character
$ color=red\ white\ and\ blue
$ ehco the value of \ $ colore is $color
the value of $colore is red white and blue
$ echo one two \
>three four
one two three four
反斜杠会忽略后面一个字符的特殊含义,不会有任何的例外。
8.3 单引号 ‘
语法:
‘    除去包括在单引号中的所有字符的特殊含义。
例子:
$ color =’red white and blue’
$ echo ‘the value of \$colore is $colore’
the value of \$color is $color
$ echo ‘the value of $color is ‘ $color
the value of $color is red whie and blue
$ echo ‘this doesn’t work’
>ctrl + c
$ echo ‘***************’
*************
单引号会去除所有的包含在其中的特殊字符的特别含义。
8.5 双引号 - “
“    除去包含在其中的特殊字符的特别含义,但\,$,和 {变量名},$(命令),“ 除外。
例子:
$ color = ‘red white and blue’
$ echo “the value of \$colore is $color”
the value of $volor is red white and blue
$ cur_dir=”$LOGNAME – your current directory is $(pwd)”
$ echo $cur_dir
user3 – your current directory is /home/user3/tree
$ echo “they’re all here ,\\ , ‘, \” "
they’re all here,/, ‘, “
双引号引用不如单引号引用全面,但大多数的特别字符的特殊含义都会被忽略,不过你还是可以进行变量替代,$variable,和命令替代, $(cmd).
如果在使用双引号引用的时候,你也想要忽略这些特殊字符的含义,可以使用反斜杠(\),因为\同时也保持了它的特殊含义,可以用它来除去特殊字符$,或’的特殊含义。前提是他们出现在双引号当中。
注意:引用机制只能在单个命令行中使用。
8.6 总结
机制       目标
反斜杠      忽略下一个字符
单引号      忽略所有的在‘‘中的特殊字符的特殊含义
双引号      忽略所有的在“”中的特殊字符的特殊含义, \, $,{变量名}和$(comand)除外
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:44:36 | 显示全部楼层
[推荐]输入输出重定向
第九章:输入输出重定向
目标
完成这一章,你能够做以下事情:
改变UNIX命令的输出,使其输出到文件。
将UNIX命令产生的错误信息输出到文件。
改变UNIX命令的输入。
定义一个过滤器
使用一些基本的过滤器例如sort,grep和wc。
9.1 输入输出重定向简介
shell提供重定向一个命令的输入和输出的功能。大多数的命令的输出是输出到终端屏幕;比如date,ls,who等等,很多命令从键盘得到输入,命令包括mail,write,cat。
在UNIX系统中任何对象都是一个文件,包括终端和键盘都是一个文件。输出重定向 让你将一个命令的输出送到除终端以外的其他的文件中。而输入重定向让你从键盘以外的文件中得到输入。
输出重定向可以用来捕获一个命令的输出,作为日志记录记录下来,或者对其进行更进一步的处理。输入重定向可以让你可以使用一个编辑器创建一个文件,然后将这个文件送到一个命令,而来代替没有编辑的能力的交互式的输入方式(例如mail命令)。
这一章介绍输入输出重定向,然后介绍一些UNIX的过滤器。过滤器是一种特殊的工具,它能进一步处理一个文件的内容。
9.2 标准输入,标准输出,和标准错误
每一次系统启动的时候,都会自动建立三个文件,这三个文件叫做标准输入,标准输出,标准错误。
shell从标准输入文件得到输入。这个文件使用C语言的描述符“0”,来打开,通常指向你的键盘。所以,当shell需要输入的时候,必须使用键盘来输入数据。
一些命令,如mail,write,cat,从标准输入得到输入,其方式为输入命令和参数,回车,然后命令会等待你提供输入来进行处理。输入的结束标志是回车和ctrl+d
shell将输出写到这标准输出文件,这个文件使用C语言的描述符号“1”来打开,通常为你的终端。因此,当shell产生输出,这些输出数据通常显示在你的屏幕上
大多数的UNIX命令会产生标准输出,这些命令有date,ls,cat,who等等。
shell会将错误信息输出到标准错误文件,这个文件使用C语言的描述符“2”来打开。同标准输出一样,标准错误会输出到你的终端。标准错误可以重新定向输出到独立的标准错误文件中。
大多数UNIX系统命令在被不恰当调用的时候会产生一个错误信息。想要看一个标准错误的例子,输入:cp 然后回车。cp使用信息会显示在你的屏幕上,而这些信息实际上是通过标准错误流来传送的
下面将要告诉你如何更改标准输入,标准输出,标准错误的默认值,如从一个文件得到输入而不是从键盘,在其它地方产生输出(而错误信息)而不是在终端。
9.3 输入重定向 - <
任何命令,只要能从标准输入得到的输入,都可以被重定向从另外一个文件得到输入
例子:
$ cat remind
your mother’s birthday is November 29
$ mail user3 < remind
$ mail
$ From user3 Mon July 15 11:30 EDT 1993
your mother ‘s birthday is November 29
?d
$
命令从标准输入得到它的输入,但是你可以重定向输入,使其能够从其他文件而不是从键盘得到输入。mail 命令常常和输入重定向一起使用。我们可以用一个编辑器创建一个文件,其中包含一些我们想要mail的文本,然后我们可以重定向mail命令的输入,使其可以使用这个文件中的文本。这种方式在你有一个非常长的mail信息。或者你想要保留这个邮件信息作为将来的参考的时候非常有用。
而命令从标准输入得到输入的方式为:输入命令和参数,回车,然后命令会等待你提供输入来进行处理。输入的结束标志是回车和ctrl+d。
许多命令接受标准输入同时也接受文件名作为参数。这个作为参数的文件会被这个命令处理。cat命令就是一个很好的例子。cat命令可以显示直接从键盘输入的文本,显示作为参数的文件的内容,或者显示通过重定向的文件的内容。
从标准输入得到输入 使用命令行参数 重定向输入
$ cat回车
在此输入文本
ctrl + d 结束
输入的文本的内容在这里显示
$ cat file
显示文本的内容
$ cat < file
显示文本的内容
注意:输入重定向不会改变被输入文件的内容。
9.4 输出重定向 >和>>
所有的可以输出到标准输出的命令都能重定向输出到另外一个文件。
例子;
建立/覆盖          建立/增加
$ date > date.out       $ ls >>ls.out
$ date > who.log        $ who >> who.log
$cat > cat.out         $ ls >> who.log
在此输入文本
ctrl + d
许多命令都会在屏幕上输出。输出重定向让你可以捕获这些输出,并且保存为一个文本文件。
如果在一个命令的后面加上一个输出重定向符号(>),这个命令产生的标准输出就会输出到这个文件中,而不是到输出到屏幕上。如果这个文件在命令执行的时候并不存在,它会被自动建立。如果这个文件存在,它的内容会被覆盖;
如果你想要在文件后添加,而不是覆盖文件。你可以使用输出重定向的附加的符号(>>),如果文件不存在,也会被创建。在两个>符号之间不能有空格。
注意:shell不能在同一时刻打开同一个文件作为输入重定向和输出重定向。所以,唯一的限制是输入文件和输出文件必须不同。否则你会丢失文件的原始的内容,而输出重定向也会失败。
例子: cat f1 f2 >f1 会导致文件f1的内容丢失。
9.5 错误重定向-2>和2>>
任何命令,只要能产生错误信息到标准错误,都可以将错误信息重定向到其它的文件
例子:
 $ cp 2> cp.err    创建/覆盖
 $ cp 2>> cp.err   创建/增加
 $
 $ more cp.err
 Usage: cp [-f] [-i] [-p] source_file target_file
     cp [-f] [-i] [-p] source_file ...target_directory
     cp [-f] [-i] [-p] -R|-rsource_directory
 Usage: cp [-f] [-i] [-p] source_file target_file
     cp [-f] [-i] [-p] source_file ...target_directory
     cp [-f] [-i] [-p] -R|-rsource_directory
如果一个命令键入不正确,shell就不能正确地解释这个命令,这时会生成一个错误信息。虽然这个错误信息也是在你的屏幕上显示,但它们实际上是通过与原始输出信息不同的文件来传输的。错误信息的传送是通过错误流,也称为标准错误来传输的,标准错误的文件描述符为2。
所以,当指明一个错误重定向的时候,你必须指明你想要捕获是信息流为2的信息。为了重定向标准错误(2>),在2和>之间不能有空格。同输出重定向相似的是,如果需要,会创建一个文件,或者覆盖已经存在的文件。你能够使用(2>>)来在一个已存在的文件末尾添加信息。
从管理员的观点来看这种机制十分有用。通常你只关心命令出错或经验问题。而将错误信息同普通的输出信息分离,使你可以很容易捕获这些错误信息,形成和维护一个日志文件,其中记录有你的程序遇到的问题。
9.6 什么是过滤器
读取标准输入和产生标准输出。
过滤输出流或者一个文件的内容
发送结果到屏幕,不改变输出流或文件的内容。
当和输出重定向相联系的时候处理其它命令的输出。
例子:vcat,grep,sort,wc
你已经了解了如何重定向命令的输入或输出。而一些命令可以从标准输入接收输入,产生输出到标准输出。这些命令被称为过滤器。过滤器只过滤而不会修改其处理的文件的内容。过滤器产生的结果通常都传送到终端屏幕上。
过滤器在处理文件的内容时非常有用。例如计算行的数目(wc),按照字母排序(sort),或查找包含有一个模型的行(grep)。
另外,过滤器可以用来处理任何命令的输出。由于过滤器能够操作一个文件,并且命令的输出能够被重定向到一个文件,这两种操作联合起来能够对执行任何命令的输出进行强大和灵活的处理。 由于大多数的过滤器的输出是输出到标准输出,被过滤的结果能够被进一步地处理,其方式是将过滤出来的内容输出到一个文件,并且在这个被过滤的文件上再执行另外的过滤。
9.7 wc - 单词计数(Word Count)
语法:
wc [-lwc] [file...] 计算一个文件的行数,单词数,和字符数
例子:
$ wc funfile   funfile作为命令行参数提供
116 529 3134 funfile
$
$ wc -l funfile
116 funfile
$
$ ls >ls.out
$ wc -w ls.out  计算在你的目录下条目的数量。
72 ls.out
wc命令计算被提交到标准输入或是一个文件的行数,单词数,和字符数。命令的选项有-l,-w,-c。-l选项会显示行数,-w选项会显示字数,-c选项会显示字符数。选项的顺序没有要求,输出的结果都是按行,字和字符数排列。
由于wc从标准输入接收输入,并且将其结果写到标准输出,所以wc是一个过滤器。对一个文件执行wc不会影响到文件的内容。
其他例子
 $ wc 回车            计算从标准输入提供的输入
 ab cde
 fghijkl
 mno pqr stuvwxyz
 ctrl + d
 3 6 32
 $ wc < funfile        标准输入被文件funfile代替,不显示文件名。
 105 718 3967
 $ wc -w funfile
  718 funfile
9.8 sort - 字母或数字排序
语法:
sort [-ndutX] [-k field_no] [file...]  sort lines
例子:
$ sort funfile     funfile作为命令行参数提供
$tail -1 /etc/passwd
user3:xyzbkd:303:30:studentuser3:/home/user3:/usr/bin/sh
 1   2  3 4  5     6     7
$ sort -nt: -k 3 < /etc/passwd
$ who>whoson
$ sort whoson         以字母排列登录的用户名。
$ sort -u -k 1,1 whoson    排序时排除双倍行
sort命令强大而灵活。它能够依靠数字或字母来对一个文件的行排序。通过sort也能选择一行中的一个特殊的字段。sort也是一个过滤器,所以它也能从标准输入接收数据,但是它也会对作为命令行参数而提供的文件的内容进行排序,
sort选项     sort类型
none       辞典(ASCII)
-d        目录(不处理非字母,数字,或空白的目录)
-n        数字
-u        唯一的(删除所有的双倍行)
字段之间的分隔符默认为空字符(一个空格或一个TAB)。你可以使用-t X选项来指定一个分隔符,其中X代表分隔符。由于冒号(:)在shell中没有特殊的意义,于是它通常被用来作为一个文件中的分隔符。
当你确定了字段之间的分隔符是什么,你就可以使用sort 的-K n 选项来通知sort命令,你想要基于那一个字段来排序,其中n代表sort将要排序的的字段号。sort命令假定字段号是由1开始的
sort命令支持多个选项来执行更复杂的操作。请使用man 来查找其具体用法。
其它例子
$ sort 回车        排序的输入来自标准输入
mmmmm
xxxx
aaaa
ctrl + d
aaaa
mmmmm
xxxx
$ sort < funfile     标准输入被文件funfile代替
sort可以从标准输入接收数据,如上例,因此,你可以使用输入重定向从一个文件得到输入。
注意:shell不能同时打开同一个文件用作输入重定向和输出重定向。然而,sort选项-o output_file能被用来制造一个输出文件代替标准输出。这样,这个文件可以与输入文件同名。
这样做的最大好处就是:
如: sort -0 whoson -d whoson 可以在文件whoson内部执行一个目录的排序。
9.9 - 匹配模型(字符串搜索)
语法:
 grep [-cinv] [-e] pattern [-e pattern] [file...]
 grep [-cinv] -f patterns_list_file [file...]
例子:
 $ grep user /etc/passwd
 $ grep -v user /etc/passwd
 $ grep -in -e like -e love funfile
 $ who > whoson
 $ grep rob whoson
grep命令十分有用。它通常使用一个模型作为它的第一个参数,使用任何数目的文件名作为它剩下的参数。在每一个模型前面使用-e参数,或在一个模型列表后面使用-f选项都可以让grep命令一次搜寻几个模型。这个命令会搜寻文件的每一行来查找指定的模型。然后grep命令会显示包含有这个模型的那些行。
grep有四个常用的参数:-n,-v,-i,和-c。
-c      仅仅显示匹配行的数目
-i      告诉grep忽略以下的模型中的字母。
-n      显示每一个显示行的行号。
-v      显示不包含模型的行
象所有的过滤器一样,如果没有指明文件,grep从标准输入读取数据,并且输出到标准输出。
grep 能够进行一些更复杂的搜寻。你可以提供一个你想要查找的文本的模型。这个模型叫做通用表达式。以下是一些通用表达式的特殊字符。
^      匹配一行的开始
$      匹配一行的结尾
.      匹配任何单字符
*      先前的模型被重复0次或多次。
[]      字符类,指明一组字符
[ - ]    短斜杠指明一个字符的范围
[^ ]     切换选择的过程
为了避免shell解释特殊字符所产生的问题,最好使用引号来封闭通用表达式。
9.10 输入输出重定向总结
cmd < file    重定向命令的输入从文件输入
cmd > file    重定向命令的标准输出到文件
cmd >> file    重定向命令的标准输出并添加到文件的末尾
过滤器      一个能接收标准输入,产生标准输出的命令
wc        计算行数,字数,和字符数
sort       以字母和数字方式来排列
grep       查找一个模型在哪些行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-30 17:45:49 | 显示全部楼层
[推荐]管道
第十章:管道
目标
完成这一章,你能够做以下事情:
了解管道的用途
建立一个管道,使其从一个命令获得输出,然后为另一个命令制造输入
使用tee,cut,tr,more,和pr过滤器
10.1 管道简介
shell提供通过管道将命令连接起来的能力。通过对文件进行过滤充分了体现UNIX系统操作环境的灵活性。你能够使用管道来过滤一个命令的输出。
这一章会介绍管道,和一些过滤器(cut,tr,tee和pr)的使用,这样你就能对文件或命令的输出作进一步的处理。
10.2 为什么使用管道
  不使用管道                      使用管道
$ who > temp_file
$ wc -l < temp_file          
$ rm temp_file
 who | wc -l
如果你使用I/O重定向来完成过滤一个命令的输出的操作,你会首先重定向一个命令的输出到临时文件然后过滤这个临时文件的内容,而当你完成这些操作后,你又要删除这个临时文件。虽然这种方式扩展了命令的能力,但是删除临时文件的操作显得不是很方便。
管道让你直接将一个命令的输出传送到另一个命令的输入,你不需要创建中间文件,因此当你完成操作的时候不需要进行清除操作。这就是UNIX系统的灵活和强大的具体体现:命令和命令可以被链接在一起,提高了单个命令行的处理能力。
10.3   '|' 符号
“|” 符号(读成管道符)的作用是联接两个命令。管道符左边命令的标准输出会被用作管道符右边的命令的标准输入,而出现在管道中间的命令,必须能够接收标准输入和输出到标准输出。
过滤器例如wc,sort,和grep就可以接收标准输入并产生标准输出,所以,它们可以出现在一个管道的中间。通过将命令和过滤器链接到一起,使你能够执行一些复杂的操作。
以下是管道的每一个位置的命令的要求:
任何在一个|符号左边的命令必须能够输出到标准输出。
任何在 | 符号右边的命令必须能够从标准输入读取数据。
任何在两个 | 符号之间的命令必须能够接收标准输入并且能够制造输出到标准输出。(是一个过滤器)
more 命令
more 命令被用来在屏幕上显示文件的内容,一次显示一屏。more 命令同样也能读取标准输入。因此,它能出现在一个管道的右边,用来控制任何命令的输出,并且产生输出到标准输出。如果命令的输出很长(一屏显示不完),你可以使用more命令实现一次浏览一屏的功能。
10.4 管道与输入输出重定向
输入输出重定向       管道
语法:
cmd_out > file       cmd_out | cmd.in
or
cmd_in < file
例子:
who > who.out        who | sort
sort < who.out
输入输出重定向总是在一个命令和一个文件之间进行。输出重定向会捕获一个命令的标准输出,并且把它输出到一个文件。输出重定向一般用来记录日志或者长时间地存贮一个命令的输出数据。输入重定向将输入从键盘变成从文件。输入重定向执行起来不是很明确,因为大多数的命令接收标准输入,同样也接收文件名作为命令行参数(mail和write除外)。但是具备输入重定向的能力是一个命令能出现在一个管道符号的右边的必须要求。
管道通常被用来联接两个命令。如果你想要使用另外一个命令来进一步处理一个命令的输出,应该建立一个管道。输入输出重定向被用来在命令和文件之间,而管道被用来在命令之间。
10.5 管道中的重定向
每一个命令都有三个有效的数据流:标准输入,标准输出,标准错误。管道中的每一个命令都保留有某一个数据流。而没有被管道使用的数据流可以被重定向。
以下是一个管道的不同部分的重定向的有效性的一个汇总:
任何在一个管道符号的左边的命令能够被重定向输入,和错误,因为它的输出被传送到管道右边的命令。
任何在一个管道右边的命令能够被重定向输出,和错误。因为它的输入来自管道中前一个命令。
任何在管道中间的命令能重定向错误,因为它的输入来自前一个命令而它的输出要送到管道中的下一个命令。
例子:
$ grep user /etc/passwd | sort > sorted.users
$ grep usesr < /etc/passwd 2> grep.err | sort > sorted.users 2> sort.err
$ grep user < /etc/passwd | sort 2 > sort.err | wc –l > wc.out 2> wc.err
上例中的输出会送到一个文件,在屏幕上不能看到标准命令的输出。
10.6 一些过滤器
cut    抽取指定的列或者字段。并且显示在屏幕上。
tr     转换字符
tee    输出到一个文件同时输出到标准输出。
pr    打印并且格式化输出到标准输出
过滤器(如sort,grep)提供了一种灵活的机制来对命令的输出进行处理。这一章剩下的部分介绍可以在管道中应用的三种新的过滤器。像其他的过滤器一样,这些命令接收标准输入,所以它们可以出现在一个管道的右边,同时它们产生标准输出,所以它们同样能出现在管道的左边(或者在一个管道的中间)
cut命令让你从标准输入或者一个文件中抽取出文本的列或者是字段,然后将结果送到标准输出。
tee命令允许你将命令的输出送到一个文件和标准输出。
pr命令被用来格式化输出,通常被用来准备输出一个文件到打印机。
同其它过滤器一样,这些命令不会修改原始文件的内容。处理的结果会被送到标准输出。
10.7 cut 命令
语法:
cut -clist [file...] 从文件或标准输入抽取列或者字段
cut -flist [-dchar][-s][file...]
例子:
$ date | cut –c1-3
$ tail –1 /etc/passwd
user3:mdhbmkdj:303:30:student user3:/home/user3:/usr/bin/sh
1    2     3  4    5        6      7
$ cut –f1,6 –d: /etc/passwd |
$ cut –f1,6 –d: /etc/passwd | sort –r
$ ps –ef | cut –c49- | sort –d
cut 命令被用来从标准输入或者一个文件中抽取特定的列或者字段。被抽取的列或字段会被送到标准输出。-c 选项剪切列,-f选项剪切字段。cut命令能从标准输入或者一个文件接收输入,由于它接收标准输入,所以它可以出现在一个管道的右边。
一个数字列表被用来告诉cut要抽取得哪些列或字段。列的定义同sort命令类似。定义列或者字段列表有以下的格式:
A-B 从A到B的列或者字段
从A到列或字段的最后一行
-B 从列或字段的开头到B
A,B 字段A或者B
以上的格式也可以组合在一起使用,例如:
cut -f1,3 5-7 /etc/passwd
会剪切出/etc/passw文件的第一和第三列,第五列到第七列。
默认的字段分隔符为tab符号。如果你使用的是其它分隔符,可以使用-d char 选项,其中char是分割你的输入的字段的字符。(这类似于sort命令的-t X选项)。冒号是一个通用的分隔符,因为它在shell中没有什么特殊含义。
同样,-s选项,在剪切字段的时候,会丢弃所有的没有分隔符的行。
例子:
$ cut –c1-3 回车
12345
123
abcdefgh
abc
ctrl + d
$ date | cut –c1-3
10.8 tr 命令
语法:
tr [-s] [string1] [ string2]      转换字符
例子:
$ who | tr –s “ “
$
$ date | cut –c1-3 | tr “ [:lower:] “ “ [:upper:] “
tr命令的作用是转换字符。它可以接收标准输入也可以接收文件名作为参数;因此它能被用在管道中。
tr命令可以用来转换许多连续的空白字符为一个空白字符,如上例所示。你也许注意到许多的UNIX命令会在它们的字段之间插入一定数量的空白。因此,当你想要在字段之间使用一个单个的分割符号的时候,在一个管道中的tr能够方便地进行一次前期处理,。
tr命令同样能够被用来替代文字的字符或者转换文本的大小写,就象上例中的第二个例子。
10.9 tee命令
语法:
tee [-a] file [file...] 分流管道
例子:
$ who | sort
$ who | tee unsorted | sort
$ who | tee unsorted | sort | tee sorted
$ who | wc –l
$ who | tee whoson | wc –l
               标准输入---》    ---》标准输出
                     |
                     文件 
通常你在执行一个复杂的管道操作的时候,管道中间的命令的输出被提交到管道中的下一个命令处理,这时你不能够看到中间命令的输出。tee命令被用来分接一个管道。Tee从标准输入读取数据,然后输出到标准输出,同时输出到一个指定的文件。如果使用-a 选项,tee会在文件末尾添加输出而不是覆盖文件。
tee命令适合在两种环境中使用。
从管道收集中间命令的输出:
  当你在一个管道中加入tee,你就可以捕捉中间处理,然后传送到管道的下一个命令。
  发送一个命令的最后的输出到屏幕同时到一个文件。
这是一个有用的日志机制。你也许想要交互运行一个命令并且观察它的输出,同时要保存这个输出到一个文件。请记住,当你仅仅重定向一个命令的输出到文件的时候,在屏幕上是没有显示。所以,这个工具能被用在管道的最后,或者在任何产生输出的命令的最后。
10.10 pr 命令
语法:
pr [ -option] [file....] 对标准输入格式化并且产生标准输出
例子:
$ pr –n3 funfile
$ pr –n3 funfile | more
$ ls | pr –3
$ grep home /etc/passwd | pr –h “user Accounts”
pr 命令可以打印到标准输出:它被用来格式化标准输入数据流或者格式化指定文件的内容。然后输出到屏幕,而不是到打印机,pr命令典型的执行情况是,在文件被送到打印机打印前格式化文件的内容。
pr 命令在打印长文件的时候非常有用,因为它会在每一个新页的顶部插入一个标题,其中包括文件名(或者是使用-h选项定义的标题),和页号。
pr命令支持许多的选项。你可以使用man来查找每个选项的具体用途。
10.11 管道-总结
管道 cmd_out | cmd_in
cmd_out | cmd_in_out | cmd_in
cut 抽取列或者字段输出到标准输出
tee 发送输出到标准输出同时到一个指定的文件
pr 在屏幕上格式化打印信息,通常和lp一起使用。
tr 转换字符
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表