在经过上机操作实践以及掌握Unix系统相关的基础知识之后,可以说已跨进了迈向成功的门槛。接着要登堂入室,继续专进,就必须更加深入的了解Unix基本命令的功能、使用并掌握一些必备的技巧。这一轮学习会有一定难度,需要强烈的求知欲和进取心作为源动力,因为只有“不满足才是向上的车轮”;同时也需要注重学习方法,善用前人总结的“约取而实得”的经验,巧学精进,迎难攻解,从而达到再上台阶之成效。
一、文件系统的相关命令
佛教《百喻经》中有一则三重楼的喻里,说有一个财主,见到他的邻居盖房子,三层楼盖得很漂亮,他也要盖这样的三层楼房子。见工匠在做地基,他就说不要地基,要直接盖第三层楼,因为第三层最高最漂亮。我们都会觉得这个财主很可笑,但在学习知识的过程中,我们可别老想着第三层而忽视打好地基噢!
文件系统相关的命令是操作Unix系统的基础,在《Unix操作系统的入门与基础》一文中我们曾使用过其中的部分命令,下面就再来仔细学习这些命令的使用,继续打好今后盖“三层楼”的“地基”吧。
(一)目录管理
我们可以通过使用mkdir、rmdir与cd命令来创建、删除目录以及改变工作目录,并通过ls命令列表显示目录内容,以达到对目录的有效管理。
(1)mkdir命令的功能是创建目录,并且可同时创建多个目录,格式如下:
mkdir [-p] directory-name(s)
参数p代表在建立指定目录时,如果其父目录不存在,则一同创建。
[例]
mkdir dir1 dir2 dir3 //在当前目录下建立目录dir1、dir2、dir3
mkdir dir1/dir4 //在当前目录下的dir1子目录中创建目录dir4
mkdir –p dir6/dir7 //在当前目录下,由于不存在dir6目录,则先自动创建目录dir6,
//然后创建其子目录dir7
(2)rmdir命令的功能是删除目录,但其只能删除空目录(即目录中不包含文件),故此命令一般较少使用,在后文中会介绍一个更为常用的删除目录命令。rmdir命令的格式如下:
rmdir directory-name(s)
(3)在进行处理文件等的操作过程中难免需要在不同的目录下工作,这时cd命令就能派上用场了。cd命令的功能是改变当前的工作目录,它的命令格式如下:
cd [directory-name]
cd后面的目录可以是绝对路径,也可以是相对路径。如果cd后面不跟路径名,则是回到用户的主目录。如果大家对此处的一些概念不甚熟悉的话,请参见《Unix操作系统的入门与基础》文中的介绍,此处就不再赘述了。下面来看几个例子:
cd dir1 //进入当前目录中的dir1子目录
cd .. //进入上级目录,即把工作目录改变成当前目录的父目录
cd ../zcl //回到父目录,同时再进入zcl子目录中
(注:上述三个命令的路径都为相对路径)
cd /home/anray //把工作目录改变成根目录中的home目录下的anray子目录
(注:此处路径为绝对路径)
此外,使用pwd 命令可以查看当前的工作目录,它显示的是当前工作目录所处的绝对路径。
(4)ls命令的功能是列表显示指定目录中文件及子目录的信息(其实在Unix系统中目录本身也被视为一个文件,但是为了照顾习惯的思维,在叙述时仍然将其区分为文件与目录两类),缺省输出顺序为纵向按字符顺序排列。它常用的命令格式如下:
ls [-altFR] [directory-name]
参数a代表显示所有类型的文件,包括文件名以“.”为第一个字符的隐藏文件。参数t代表按文件最后修改时间的顺序依次排列文件,参数R将会列出指定目录下以及其所有子目录中的文件,使用参数F将会在列表中的每一个目录后面加上“/”,在每个可执行文件后面加上“*”。参数l代表长列表显示目录内容,即列出文件的类型、访问权限、拥有者、文件大小、修改时间及名称等详细信息。下面将介绍一下长列表显示中的信息的含义,“ls –l”命令的使用如下图所示。
在上图长列表显示文件信息的每一行中,
第一列 |
第1个字符表示文件的类型;
第2-4个字符表示文件所有者对此文件的访问权限;
第5-7个字符表示用户组对此文件的访问权限;
第8-10个字符表示其他用户对此文件的访问权限; |
第二列 |
文件的链接数 |
第三列 |
文件的所有者 |
第四列 |
文件的用户组名 |
第五列 |
文件所占的字节数 |
第六至八列 |
文件上一次的修改时间 |
第九列 |
文件名 |
注:此表格中的一些概念在下文会有详细介绍,这里只需先了解一下即可 |
(二)文件管理
1、文件的创建、编辑与删除
Unix系统中可以使用touch命令来创建新文件,它的命令格式如下:
touch filename(s)
但要指出,touch命令最常用的功能并不是创建文件,而是改变指定文件(或目录)的最后访问时间和修改时间。它的命令格式如下:
touch [-am] [mmddhhmm[yy]] filename(s)
此命令中,若指定文件不存在,则创建之;若已存在,则将指定文件的访问时间和修改时间按参数的要求进行改变。参数a代表只改变访问时间,参数m代表只改变修改时间。参数mmddhhmm[yy]中每隔两位分别表示“月日时分[年]”,用户可利用此参数指定欲设置的时间,若不带此参数,则会自动使用系统当前的默认时间。
[例] 在当前目录下创建新文件document:
touch document
将刚创建的文件document的访问与修改时间改为2005年10月1日0时0分:
touch -am 1001000005 document
大家可不要小视touch命令的此项作用,在软件的实际开发中,有时它还会与企业的客户关系管理策略或企业经济效益密切关联。倘若你所在企业的开发团队协作精神好,工作效率高,或者是改进了相关技术与流程,使原与客户合同中约定的项目完成日期大大提前,为了屏蔽用户知情,避免节外生枝,该命令就派上大用场了。这事我知你知即可,彼此只能心照不宣噢!
文件创建好之后就需要对此文件的内容进行相应的编辑了,在Unix系统中最常使用的编辑工具是vi,在后文中会有专门的章节进行详细介绍,此处先行略过。
在使用Unix系统一段时间之后,大家可能会发现文件数量正在快速增加,而其中的一部分文件可能已经变得过时,或是没有了使用价值,这时就应该及时利用rm命令将此类文件删除了。rm命令的功能是删除文件或目录,它的命令格式如下:
rm [-i] filename(s)
或 rm –r[i] directory-name(s)
使用参数i的目的是给大家一次“买后悔药”的机会。由于Unix系统中的文件一旦删除将极难恢复,因此在删除文件之前一定要慎重。而参数i的作用是在删除文件之前进行逐一询问提醒,是否确实要删除此文件。如果输入y则删除文件,若输入其他字符,文件则会被保留。使用了带参数r的rm命令可用来删除一个目录以及其所有子目录,此时不必受删除目录必须为空目录的条件限制,因此也就更具危险性,大家在使用前应当慎之又慎。
[例]
rm doc1 doc2 doc3 // 直接删除文件doc1、doc2、doc3
rm –i doc1 doc2 doc3 //在删除文件doc1、doc2、doc3时,每删除一个之前先作提示
rm -ri dir1 //删除目录dir1以及其中所含的所有文件与子目录,删除前先作提示
2、文件的查看
常用的查看文本文件的命令有cat、more、head、tail等,下面将逐一进行介绍。
(1)cat命令可以在屏幕上显示出文本文件的内容,它的命令格式如下:
cat filename(s)
不过cat最常见的用法是配合重定向符来清空文件以及将几个文件合并成为一个文件。重定向符的详细用法请参见本文第二章节的内容。
[例]
cat /dev/null > doc.txt //清空文件doc.txt,/dev/null代表空设备文件(记住使用即可)
cat < doc1.txt >> doc2.txt //将doc1.txt中的内容保存在doc2.txt的尾部
(2)使用cat命令查看文本文件时会有一个问题,就是它不会分屏显示文件,这样当文件的内容超出一屏时,除了最后一屏的内容之外,上面的内容都将是一闪而过。当然解决的办法Unix也替我们想好了,就是使用more命令来查看此类文件。more命令的格式如下:
more filename
more命令将会以分页的方式显示文本文件内容。当每次将文件内容显示在屏幕上时,如果内容超出一屏,则会在屏幕的左下部显示“ --more--”,并且在其后面显示百分比表示已显示部分占总内容的比例。此后按回车键则会下滚一行,按空格键则会下翻一屏,按“b”字母键可以返回上一屏,按“h”字母键可以获得关于更多功能的帮助;使用“/”加上字符串可以查找指定字符串的内容信息,找到后可以按“n”字母键继续搜索下一个符合要求的内容信息,按“q”字母键则可退出并返回Shell命令提示符状态。
(3)head & tail 命令
head与tail命令的格式如下:
head [-n] filename(s)
tail [-n] filename(s)
head命令的功能是显示一个或多个文件开头n行的内容,tail命令的功能是显示一个或多个文件最后n行的内容。若没有指定参数n,则系统会默认显示10行内容。
(三)文件与目录的访问权限
1、文件访问权限简介
在Unix系统中每个文件(或目录)都包含有一套权限,这些权限决定了谁能访问该文件以及如何访问该文件。通常文件有三种权限:
权限 |
普通文件的权限 |
目录的权限 |
r |
读取文件内容 |
读取文件名称 |
w |
向文件写入信息 |
建立和删除文件,可以改变文件名等 |
x |
执行文件 |
使用该目录中的文件 |
在Unix系统中有三种不同的用户类型,分别是所有者(owner)、用户组成员(group)、其他用户(other)。所有者是指文件的创建者;用户组成员是指由若干个用户组成的组内成员;而除所有者、用户组成员之外的访问者,统称为其他用户。所有者除拥有相关的访问权限外,还有向另两类用户授权之权限。用户组中的成员在同组内可以共享信息,通常某一类或某一项目中的用户会被Unix系统管理员归为一个用户组,每个用户都被授予能访问同组成员文件的权限。其他用户在所有者的授权下可对文件有读、写或执行的权限。
上文中我们曾提到使用“ls –l”命令来显示文件的访问权限。如图中所示:
以文件myfile1为例:
|
所有者 |
用户组 |
其他用户 |
权限 |
rw- |
r-- |
r-- |
含义 |
可读、可写、不可执行 |
可读、不可写、不可执行 |
可读、不可写、不可执行 |
2、文件访问权限的设置
使用chmod命令可以修改文件的访问权限,chmod命令的格式分为两种:
格式1:chmod symbolic_mode file(s)
格式2:chmod absolute_mode file(s)
(1)格式1:符号模式(symbolic_mode)的命令格式如下:
chmod who op permission(s) file(s)
参数who表示用户类型,它的内容为以下一项或多项:
u |
文件所有者 |
g |
用户组 |
o |
其他用户 |
a |
所有用户 |
参数op表示操作:
+ |
表示要增加permission指定的权限 |
- |
表示要取消permission指定的权限 |
= |
设置为permission指定的权限,并取消原设置权限 |
参数permission为权限类型,它的内容为以下一项或多项:
[例] 以上图为例,要为myfile1的所有者增加执行权限,用户组增加写权限与执行权限,取消其他用户的读权限,使用命令如下:
chmod u+x,g+wx,o-r myfile1 //为不同用户类型设置权限时用“,”分隔
(2)格式2:绝对模式(absolute_mode)的命令格式如下:
chmod xyz file(s)
参数x、y、z分别代表0-7的数字,用来表示所有者、用户组、其他用户对该文件的访问权限。x、y、z所代表的0-7数字的含义如下:
Value |
permission |
7 |
r w x |
6 |
r w - |
5 |
r – x |
4 |
r - - |
3 |
- w x |
2 |
- w - |
1 |
- - x |
0 |
- - - |
[例] 用绝对模式来完成符号模式中的例子:
chmod 770 myfile1
从对比中大家应该感受到,符号模式会更加直观一些,而绝对模式的数字含义较难记忆,因此设置文件权限时推荐使用符号模式。
(四)文件与目录的移动复制
在Window系统中,我们最熟悉的操作应该莫过于“Ctrl + C”、“Ctrl + V”、“Ctrl + X”了,因为它为我们节省了大量的时间,带来了极大的便利。而在Unix系统中同样为我们准备了cp、mv命令,利用它们可以实现剪刀加糨糊的操作了:)
1、移动或重命名文件(或目录)
利用mv命令可以将一个文件(或目录)从一个目录移到另一个目录中,也可以用于重命名一个文件(或目录)。mv命令的格式如下:
mv [-i] source-file target-file
或 mv [-i] source-directory target-directory
当target-file为文件名时,则相当于文件重命名,target-directory同理。参数i代表在将文件移动到指定目录中时,若已存在同名文件,则将询问是否覆盖已存在的文件,输入y则覆盖,输入其他字符则中止移动,保留原文件。
[例]
mv beans nuts //将文件beans重命名为nuts
mv file1 file2 /tmp //将文件 file1和file2移动到目录/tmp中
mv dir1 /export/home/anray // 将目录dir1包括其所有文件与子目录都移动到目
// 录/export/home/anray下
2、复制文件(或目录)
利用cp命令可以将一个文件(或目录)从一个目录复制到另一个目录中,命令格式如下:
cp [-i] source-file(s) destination-directory
或 cp –r[i] source-directory(s) destination-directory
参数i代表在将文件复制到指定目录中时,若已存在同名文件,则将询问是否覆盖已存在的文件,输入y则覆盖,输入其他字符则中止复制,保留原文件。当复制文件到指定目录,或许会期望赋予此复制的文件不同于源文件的文件名,则只需将新文件名放在目标目录名之后,用“/”隔开即可。当需要将一个目录连同它的所有子目录一起复制到目标目录中时,可使用参数r。
[例]
cp beans apple //将文件beans复制到同目录下并改文件名为apple
cp beans apple dir1 //同时复制两个文件beans与apple到当前目录下的子目录dir1中
cp apple dir2/orange //将文件apple复制到当前目录下的子目录dir2中,并改名为orange
cp -r dir1 dir2 //将目录dir1中的所有文件以及其所有子目录复制到目录dir2中
(五)其它常用命令
1、man命令
man命令用于查看帮助信息,常用的命令格式有:
man name
或 man –k keyword
[例]
man //查看man的使用方法
man ls //查看ls命令的帮助信息
在查看帮助信息过程中,按回车键则会下滚一行,按空格键则会下翻一屏,按“b”字母键可以返回上一屏,使用“/”加上字符串可以查找指定字符串的内容信息,找到后可以按“n”字母键继续搜索下一个符合要求的内容信息,按“q”字母键则可退出并返回Shell命令提示符状态。
2、clear命令
clear命令的功能是清理屏幕,每次操作Unix系统时间长了,屏幕上的信息难免显得有些凌乱,这时clear一下是不是觉得眼前一下子“清静”了许多:)
3、date命令
date命令的功能是显示系统时间,并可修改系统时间。date命令的格式如下:
date [mmddhhmm[yy]]
date命令后若无参数,则会显示系统当前的默认时间。若要修改系统时间,则输入参数的顺序依次为“月日时分年”。如要将当前系统时间修改为2005年10月1日0时0分,则可使用如下命令:
date 1001000005
4、cal命令
cal命令的功能是显示日历。
[例1] 要查看2005年的全年日历:
cal 2005
[例2] 要查看2005年5月份的日历:
cal 5 2005
二、特殊字符的使用
先说一个事例:一次有位朋友问我有没有办法把某英语辅导软件中加密的数据搞到手,我想也没想,立刻翻箱倒柜去找出各种解密工具。大半个小时后,正在我毫无头绪之际,这位朋友跑来说自己已搞掂了这个软件的使用授权。问他,说只是给软件作者打了个电话。由此想到Unix中的一些特殊字符,往往平时操作中不曾想到去用它,而是墨守成规地进行自己所熟悉的步骤,实际上是在用那些老笨的方法。如能想到并熟知Unix中特殊字符的功能及使用技巧,就会像我这位聪明的朋友一样取得事半功倍的效果。
(一)通配符的使用
文件名是命令中最常见的参数,大家可能经常会碰到这样的情况,就是仅知道文件名的一部分,或者是想同时引用多个具有相同扩展名或以相同字符串开头的文件。Shell中提供了一套被称作通配符的符号,它们能搜索、匹配并产生一个文件名列表,通配符包括“*”、“?”、“[]”。用户执行以包含通配符的文件名为参数的命令之后,Shell会自动去搜索匹配文件并返回所发现的一个文件名列表,然后Shell就会用这些文件名作为命令的参数了。
星号“*”用于指代以特定字符串开始或结束的文件名,问号“?”代表文件名称中的单一字符,即“*”可替代文件名中任意长度的字符串,而“?”只能替代一个字符。方括号“[]” 的作用是使用户确定所需搜索的有效字符集,任何在“[]”里的字符都将被匹配。此外,在“[]”中可使用“-”来指定一个字符集范围,这样就不必手动的一个个列出来了。
请看下面的例子:
假设当前目录下有8个文件doc1,doc2,doc3,docA,docB,docC,docD,document,分别对其进行如下操作:
ls doc* //显示出doc1,doc2,doc3,docA,docB,docC,docD,document
ls doc? // 显示出doc1,doc2,doc3,docA,docB,docC,docD
ls doc[13AD] // 显示出doc1,doc3,docA,docD
ls doc[A-C] // 显示出docA,docB,docC
ls doc[1-8] // 显示出doc1,doc2,doc3
(二)命令分隔符“;”的使用
有时某些用户可能想在一行中运行多个命令,那么可以在这一行中输入多个命令,命令间用“;”相隔,如:
mkdir tmp; cp file1 tmp/file2; ls -l tmp
Unix会顺序执行以上三条命令,要注意的是在命令间使用分隔符“;”,只代表命令执行的先后顺序。
(三)重定向符的使用
用户欲执行一个命令,当然是要先输入此命令,系统默认的标准输入设备是键盘,而执行命令后的结果通常显示在系统默认的标准输出设备显示器上。但是,Unix系统具有重定向功能,即将标准输出重定向则可将命令的处理结果存入指定的文件,而非显示在屏幕上;将标准输入重定向则可把指定的数据文件作为输入源,而非从键盘输入数据。
重定向符如下:
< |
从一个文件或设备重定向输入 |
> |
重定向输出到一个文件或设备,如文件不存在则创建该文件,如文件已存在则覆盖该文件 |
>> |
重定向输出到一个文件或设备,并将输出信息追加到已存在文件的尾部 |
例如:
cal 5 2005 > doc1.txt //将2005年5月份的日历保存在文件doc1.txt中
cal 6 2005 >> doc1.txt //将2005年6月份的日历保存在文件doc1.txt尾部
//此时文件doc1.txt中保存了5、6两个月的日历
cat < doc1.txt > doc2.txt //将doc1.txt作为输入源,把其中的内容保存在doc2.txt中
(四)管道符“|”的使用
有时可能会需要将一个命令的标准输出发送给另一个命令使用,而非发送到一个目标文件,这时就需要使用Unix提供的管道符“|”在这两个命令间架起一条连接管道。管道符“|”的作用就是从“|”左边的命令接受输出数据并发送给“|”右边的命令作为输入数据。
如:ls -l /etc | more
管道符“|”的功能非常强大且很有用,利用它可以实现一些复杂的操作。在下一节关于信息查找命令部分,我们将会看到它的一些应用。
(五)其它特殊字符
美元符“$”是一个特殊操作符,当其置于变量名前面时,变量名会被变量值所代替。因此通常都是通过在变量名前加上“$”来引用该变量的值,“$”也常被称为变量取值符。
Unix中可以使用三种引号符:
(1)单引号(’ ’):功能是让系统原样输出单引号中所含的内容。
(2)双引号(“ ”):双引号中的字符串若含有通配符,则系统会先进行通配后再输出;若含有变量取值符“$”,则系统会先进行变量取值后再输出。
(3)反引号(` `):反引号中所含的内容必须是一个命令,这样它会先执行此命令,然后把命令执行的结果返回输出。
对于上述几个特殊字符,在下文关于Shell脚本编程部分大家会看到具体的应用例子。此外,常见的特殊字符还有“.”代表用户所在的当前目录,“..”代表用户所在的当前目录的父目录,“~”代表用户登陆系统的主目录。
三、与查找比较相关的命令
使用Windows系统的用户可能都有这样的经历,在网上看到可悠长品赏的电影,down;看到匠心独运的电子书,down;看到妙织锦绣的文章,down;看到衔华佩实的资料,down。但时间一长,想再回顾一下《星战前传3:西斯的反击》中奥比旺和阿纳金在熔岩横流的穆斯塔法星上展开光剑对决的精彩片段,或者是重温一下李开复先生给中国学生第四封信中所提出在大学校园应当掌握的“七项学习”,可能自己都记不清当时是放在哪个目录里了。幸好,Windows为我们提供了“搜索”功能,再加上现今Google、百度相继推出的Google 桌面搜索、百度硬盘搜索,才使得这些文件幸免于藏身深宫大院之中,茕茕孑立、形影相吊的命运。那么在Unix系统中的文件又是怎样的命运呢?且看以下的命令功能:
(一)利用find命令查找文件
find命令的功能是在指定目录及其子目录下查找符合条件的文件,命令格式如下:
find path expression
参数path指欲开始查找的起始目录,find会遍寻此目录以及其子目录,并且此参数可以有多个目录名称,只要在目录与目录之间用空格分开即可。参数expression指明了诸如基于文件名、文件类型、文件所有者、最后一次修改时间等的查找规则,find命令将遵循此查找规则来查询指定目录以及子目录中的文件。
常用的查找规则如下:
-name filename |
指定要寻找的文件或目录名称 |
-print |
将搜索到的符合条件结果以包含路径名的方式输出 |
-type x |
以文件类型作为寻找条件,常用的文件类型x如下:
d --- 目录文件, f --- 普通文件, b --- 块设备文件, c --- 字符设备文件, l --- 链接文件 |
-user user |
寻找用户user所拥有的文件,user可为用户名或uid号 |
-atime n |
寻找n天之前曾被访问过的文件 |
-mtime n |
寻找n天之前曾被修改过的文件 |
-exec command {}\; |
用寻找到的文件作为执行command的对象,{}中保存执行command时所需的参数,注意必须以 \; 为结束 |
下面来看一些具体的查找实例:
[例1] 在目录/home中查找名为javac的文件,并要显示出完整的路径名:
find /home –name javac -print
[例2] 在当前目录下查找以doc开头,7天之前曾被修改过的文件:
find . –name “doc*” -mtime 7
[例3] 在目录/home中查找名为anray的目录,并显示出完整的路径:
find /home –name anray –type d -print
[例4] 在目录/home中查找用户zcl所拥有的普通文件,并将其删除:
find /home –type f –user zcl -exec rm {} \;
(二)使用grep命令查找字符串
使用grep命令在文本文件中查找指定的字符串,并将所有出现该字符串的行打印显示出来。grep命令的格式如下:
grep [-iv] 字符串 文件名
参数i代表查找字符串时忽略字母大小写,参数v显示出所有不包含指定字符串的行。如果在欲查找的字符串中包含有空格,那么应该用单引号将此字符串引起来。此外,如果是想同时在多个文件中查找指定的字符串,那么只需列出所有欲搜索的文件即可,这样grep命令会在所列出的匹配行前加上文件名。grep常与通配符、管道符一起搭配使用,这样可以实现一些特殊的查找功能,大家应能结合上面所介绍的命令来综合应用。
[例1] 在文件file1中查找字符串“Java Web”,并忽略大小写。
grep –i ‘Java Web’ file1
或 cat file1 | grep –i ‘Java Web’
或 grep –i ‘Java Web’ < file1
[例2] 在当前目录中查找5月1日创建或修改过的文件。
ls –la | grep –i ‘may 1’
(三)比较两个文件的内容
在Windows系统中,不知你是否用过一款名为WinMerge的软件?此款软件一项非常强悍的功能,就是可以比较两个文件的内容有哪些不同之处,而且可谓是火眼金睛。记得笔者读研一的时候,听一位助教说他就是靠这款软件逮了不少抄袭作业的人:)而在Unix系统中,则无需借助第三方软件就可实现此项功能了。cmp命令可用于比较两个文件,这两个文件可以是文本文件也可以是非文本文件。在默认情况下,cmp命令会显示两个文件第一次数据不同的位置;若两个文件内容相同,则不显示任何信息。cmp命令的格式如下:
cmp [-l] 文件名1 文件名2
参数l代表标示出每个不同之处内容的行号。
另外,还可以使用diff命令来比较两个文本文件或目录的不同之处,它会详细的列出文件1比文件2增多的内容、减少的内容以及改变了的内容。diff命令的格式如下:
diff [-r] 文件1 文件2 //如果比较两个目录的不同之处,加上参数r
在得到的结果中,d表示文件1比文件2增多的内容,a表示文件1比文件2减少的内容,c表示文件1较文件2改变了的内容。
(四)使用wc命令进行统计
大家一看到wc这个词,不知道是否会产生方便的感觉,呵呵。在Unix系统中,wc可是个非常有用的命令。对于Word中的字数统计功能,大家应该非常熟悉,利用它可以统计出一篇文章中的页数、字数、字符数、行数等信息。而wc命令也同样实现了类似于Word的字数统计的功能,它把一个文件作为数据流读入,然后计算出此文件中的行数、单词数以及字符数,并输出这些统计数据。wc命令的格式如下:
wc [-lwc] filename(s)
参数l代表统计行数,参数w代表统计字数,参数c代表统计字符数。
wc -l file1 file2 //统计文件file1和file2 的行数
grep wang /etc/passwd | wc –l //统计目录/etc下的passwd文件中有多少个用户名为wang的用户
四、文件归档及压缩命令
(一)文件归档命令
用户在处理文件过程中,有时需要对某些目录及文件进行打包备份的操作,或有时需要将几个文件组合成一个文件以便于网络传送,就像减肥瘦身了的五、六个美女挤坐一辆出租车一样,这时Unix系统提供的tar命令就能有用武之地了。使用tar 命令,可以将多个文件或目录合并成为一个tar包以便于存储及传输。tar命令的常用格式是:
tar cvf filename.tar file1 file2 …directory1 directory2 …
此处参数中c表示创建一个新的归档,v表示启动显示模式,tar会显示出所处理的每个文件名,f filename.tar表示使用指定的文件名作为归档文件。
如:要将/home/zcl/down目录中的文件全部归档为down.tar,可以使用如下命令
tar cvf down..tar /home/zcl/down
当用户想把已归档的文件复原,则可使用如下的命令格式:
tar xvf filename.tar
(二)文件压缩命令
为了避免文件占用太多的磁盘空间,用户会选择将文件压缩存放。通常压缩会和归档组合使用,使用户能够对整个目录以及目录中的文件同时进行压缩。对许多Windows用户来说,使用Winzip、Winrar等工具软件来压缩或解压文件是很平常的事,那么如何在Unix系统中对文件进行压缩与解压呢?下面介绍Unix系统中常用的三种压缩类型以及解压缩命令。
1、使用gzip/gunzip 命令解压缩文件
使用gzip命令压缩后的文件名称为“原文件名.gz”,它对应的解压命令是gunzip。命令格式如下:
gzip filename
gunzip filename.gz
如:要largefile.tar文件压缩成为largefile.tar.gz,则可以使用如下命令
gzip largefile.tar
如果要把largefile.tar.gz解压,则只需使用命令gunzip largefile.tar.gz即可。
2、使用compress/ uncompress命令解压缩文件
凡是经过compress命令压缩处理的文件,会在文件名后附加上“.Z”,它对应的解压命令是uncompress。命令格式如下:
compress filename
uncompress filename.Z
3、使用pack/unpack命令解压缩文件
凡是经过pack命令压缩处理的文件,会在文件名后附加上“.z”,它对应的解压命令是unpack。命令格式如下:
pack –f filename
unpack filename.z
五、进程管理与控制命令
“进程”顾名思义就是“正在进行着的程序”,在Unix系统中一个进程可视为一项正在执行的任务,这样一个命令也就是一个进程了。Unix系统具有检查和控制进程的相关命令,它们常被用于管理Unix系统。事实上,进程不仅包括用户所执行的命令,也包括了维持Unix系统正常运行的所有程序,且每一进程都有其唯一的代号,即进程标识符。
要想查看系统当前正在运行的进程信息,可使用命令:
ps [-options] //无参数时只显示当前用户在当前窗口中所运行的进程
//如果系统提示ps为非法命令,则在csh中可使用/usr/bin/ps,
//bash中可使用/usr/ucb/ps来替代ps
参数 |
解释 |
-e |
列出所有正在运行的进程 |
-f |
长列表显示进程的细节信息,一般与e一起使用 |
-u 用户名 |
显示指定用户正在运行的进程 |
如:要求长列表显示所有与用户zcl相关的进程信息,命令如下:
ps –ef | grep zcl
此外,如果想要查看进程占用系统资源的情况,可使用如下的两个命令:
/usr/ucb/ps –auwx //查看进程占CPU、内存等系统资源的情况
prstat //时时刷新当前系统的进程信息,并按所占系统资源大小排列
在某种特殊情况下,用户可能会无法正常的结束某一进程,这时就需要使用命令kill来杀掉这一进程,不过要注意的是用户只能杀掉由其自身创建的进程。命令格式如下:
kill [-signal] process-id
或
pkill [-signal] process-name
kill就像一名狙击手,实施的是精确的“点杀”,kill会精确的杀掉指定进程号的进程,如:
kill 12345 //“点杀”进程号为12345的进程,进程号可利用ps命令查出
kill -9 12480 //-9代表强制杀掉进程,但不会清理该进程所占的资源
pkill就像一名机枪手,实施的是威力巨大的“群杀”,pkill会杀掉所有指定的进程名的进程。如:
pkill sleep //杀掉系统中所有名为sleep的进程
这里,我们再引入一个新的概念——作业。作业这一概念只有在需要对进程区分为前后台时方被使用,它等同于进程的概念。前台进程是指可以和用户直接进行人机交互的进程,它可以接收键盘输入并将结果显示在显示器上。缺省状态下用户启动的Unix程序都运行在前台。后台进程是指不直接和用户进行交互的进程,用户一般是感觉不到后台进程的运行。要让某一程序在后台运行,只需在命令行的最后加上“&”符号。在Unix系统中可以同时在前台和后台运行多个进程,通常情况下,一般把需要和用户交互的程序放在前台执行,而把不需要以交互方式执行的程序置于后台运行。
使用jobs命令可以查看当前系统中正在执行的作业,如下图所示:
在图中,“[]”中的数字代表作业号,此作业号可以配合作业管理命令一起使用:
fg %n |
将某一作业放入前台运行(n代表作业号,下同) |
bg %n |
将某一作业放入后台运行 |
stop %n |
挂起后台某一作业 |
kill %n |
终止某一指定的作业 |
此外,还应掌握三个常用的键盘指令:
Ctrl + z |
挂起前台正在运行的作业 |
Ctrl + d |
正常的结束前台作业,即先执行完该进程后结束 |
Ctrl + c |
终止前台作业(非正常方式) |
如:
[例1] 要求后台运行find命令,在当前目录及其子目录下查找文件名前缀为file的文件。
解:通常当在后台运行命令时,最好将其运行结果输出重定向到一个文件中,以便日后检查或校对。因此,此题可以使用如下的命令:
find . -name “file*” >myfind &
这样,我们就可以通过查看myfind文件来查看查找结果了。在运行此命令的同时,我们还可以继续输入其它命令来进行其它操作。
[例2] 要求前台运行find命令,在当前目录及其子目录下查找文件名前缀为file的文件,运行过程中挂起进程,并将其放入后台运行。
解:此题可以使用如下的命令:
find . -name “file*” >myfind
^z (按Ctrl + z)
jobs //通过jobs命令来查看find进程的作业号,假设为1
bg %1
这里再补充与记取一个小知识点,即当在前台杀掉某一进程后,那么此进程的所有子进程都会同时被杀掉;而如果是在后台杀掉某一进程,那么此进程的所有子进程都将“过继”给“祖宗”进程(即进程号为1的进程)而继续运行。
六、网络通信相关命令
“功能性文盲”的概念是1965年联合国教科文组织在伊朗德黑兰召开的各国教育部长会议上首次提出的,它最初的含义是指未能获得读、写及计算能力的人。时至今日,此概念的内涵已经发生了很大的变化。读——不仅要读印刷的文本,而如何快捷、有效地读取互联网上丰富的信息资源已成了现代人必备的才能;写——不仅是以往习惯的“爬格子”,而且会借用计算机的“神手”,更要将自己的所思所想写在网上,与全世界的人进行交流和互助;算——不仅需要核算物质成本和产出,而且要节约时间与精力,把握生命的张弛节律,将积极有效的精力投到最有意义的活动中去。
对于现代人来说,若离开了网络,那就真要返回到“功能性文盲”状态了。当然,Unix系统也离不开网络,它的缺省网络协议即为当今网络架构基础的TCP/IP协议。TCP/IP协议由一系列协议组成,统称TCP/IP协议族。TCP/IP协议是TCP/IP协议族中的基本协议,协议族常用协议有:
(1)传输控制协议/互联网络协议(TCP/IP - Transmission Control Protocol/Internet Protocol)是协议族的基本协议。
(2)用户数据报协议(UDP - User Datagram Protocol)提供无连接的传输层协议,不保证传输的可靠性。
(3)远程登录协议(telnet)定义了远程登录的标准。
(4)文件传输协议(FTP - File Transfer Protocol)定义了不同系统间进行文件拷贝的标准。
下面再介绍基于TCP/IP协议族的Unix系统的相关命令。
1、Telnet命令
前文中我们曾经使用过telnet命令,该命令的主要功能是在用户使用的本地计算机上通过网络登陆远程Unix主机,把本地计算机当成远程主机的一个仿真终端,而此处的网络可以是任何采用了TCP/IP协议的网络,如LAN、WAN、Internet等。在本地计算机上运行的telnet或下文将要介绍的ftp程序,实际上都是telnet/ftp的客户端程序,它通过TCP/IP协议与远程主机中的服务端程序相连。当用户利用telnet完成与远程Unix主机的连接后,就能像是在Unix主机终端上操作一样了,不过此时用户所能使用的功能和资源将取决于该系统所赋予用户的使用权限。
telnet的命令格式如下:
telnet IP地址或域名 [端口号]
此处的IP地址或域名是指远程Unix主机的IP地址或域名。当建立连接之后,将会出现信息提示用户输入登陆的用户名及口令,正确输入后就可以进入Unix系统了。
2、FTP命令
FTP的主要功能是实现本地计算机与远程主机之间的文件传输,它可以将远程Unix系统上的一个或多个文件下载到本地计算机,也可以将本地计算机上的一个或多个文件上传到远程Unix系统上。
FTP的命令格式如下:
ftp IP地址或域名
此处的IP地址或域名是指远程Unix主机的IP地址或域名。当建立连接之后,将会出现信息提示用户输入登陆的用户名及口令,正确输入后就会出现ftp提示符“ftp>”,我们就可以在此提示符后输入ftp命令进行相关的操作了。
FTP的常用命令及解释列表如下:
ftp命令 |
解释 |
bin |
设定以二进制模式传输文件 |
asc |
设定以ASCII模式传输文件(缺省值) |
pwd |
列出当前所处的远程主机目录 |
cd [directory] |
改变所处的远程目录 |
ls |
显示所处的远程目录的内容 |
lcd [directory] |
设定本地欲上传或下载文件的目录 |
put file |
将本地计算机中的文件上传到远程主机上 |
get file |
将远程主机中的文件下载到本地计算机上 |
mput files |
将本地计算机中的多个文件上传到远程主机上 |
mget files |
将远程主机中的多个文件下载到本地计算机上 |
bye |
退出ftp |
下面是一次模拟的FTP登陆实例。假设远程主机的IP地址为198.4.30.25,现在要求将本地计算机系统/home/zcl中的文件Calculator.java上传到远程主机/newusers/zcl目录中,同时将/newusers/zcl目录中所有的文件下载到本地计算机目录/home/zcl/down中。
解:
ftp 198.4.30.25
Name:
Password:
(输入Unix用户名及口令)
ftp> asc
ftp> lcd /home/zcl
ftp> cd /newusers/zcl
ftp> put Calculator.java
ftp> bin
ftp> lcd /home/zcl/down
ftp> mget *
ftp> bye
说明:
当我们使用ftp时,可简单地把文件分为两种基本类型:文本文件和二进制文件。文本文件也称为ASCII文件,其文件内容遵循ASCII的定义,其主要特征是文件内容由若干行组成,可以使用操作系统的显示、编辑命令来显示和编辑ASCII文件的内容,它使用的传输模式是“asc”。二进制文件(Binary File)是指除ASCII文件以外的所有文件格式,它使用的传输模式是“bin”。需要注意的是,可以将ASCII文件按二进制模式传输,但决不能将二进制文件按ASCII模式传输,否则二进制文件的内容会遭到破坏而无法使用。
3、用户间通讯命令
对于QQ、MSN这类聊天工具,大家应该是再熟悉不过了,那么在Unix系统中能否进行此类的聊天操作呢?答案当然是肯定的。Unix提供了多种方式让用户相互通信,它允许以文本的方式给某个用户或所有用户传递信息,而信息来源可以是文本文件或直接由键盘输入的内容。
(1)使用write发送消息
使用write命令可以向任何已登录同一系统的另一位用户发送消息,这时在对方用户终端上就会自动显示出信息,而对方也同样可以使用write 命令来回复消息,这样双方之间就能互相通信了。
write命令的格式如下:
write user-name
此处user-name是将要与之通信的用户名,可以使用who 命令来查看系统中已登陆的用户名。输入write命令后,即可进入发送消息状态,这时就可以通过键盘输入消息,回车即可向对方发送此条消息了。要想退出发送消息状态,可以使用“Ctrl + d”退出write 命令回到shell。
(2)使用talk进行双方对话
talk命令允许双方实现类似于MSN、QQ这样的实时对话,其命令格式如下:
talk user-name
当用户向另一用户发送对话请求,只有在对方同意接受对话请求,即对方也使用talk命令后,双方的对话才会建立。这时双方终端上都会显示“[connect established]”,这样双方就可以从键盘输入文字,talk会把这些输入显示在对方的屏幕上,若任意一方按键就会退出对话状态。
(3)使用wall进行广播式消息传送
使用wall命令可以向所有用户广播通知信息,而所有登录系统的用户都可收到该消息。wall命令有以下几种格式:
wall
wall filename
wall “send a message to all the people!”
(4)使用mesg允许或拒绝接收消息
当一位用户正在全身心的投入某项工作的时候,可能会不想被另外一位用户用上述方式突然发送来的消息打断思路,那么就可使用mesg命令来设置是否允许接收由其它用户发来的信息。mesg命令的格式如下:
mesg –n
或
mesg -y
其中,y表示允许接收信息,n 表示拒绝接收信息。如果mesg后面没有跟参数,则报告当前的许可状态。
、其它命令
(1)查看网上用户信息
使用finger命令可以显示当前正在使用Unix系统的所有用户信息,它的命令格式如下:
finger [用户名][@主机域名或ip地址]
如:
finger //显示当前正在使用Unix系统的所有用户信息
finger anray@198.4.30.25 //查看主机198.4.30.26上用户anray的信息
此外,常用的显示当前系统登陆用户信息的命令还有:
who //可查看每个登陆用户的IP地址
w //可查看每个登陆用户的当前行为
who am i //查看使用者自己的信息
(2)查看网络的相关信息
hostname //显示主机名
cat /etc/hostname.hme0 //显示主机名
cat /etc/hosts //查看同一网段中存在的所有主机
cat /etc/services //查看当前系统所运行的所有程序的端口
ping 主机IP地址 //检测是否可以访问某个主机
netstat //列出系统中所有的网络连接
/usr/sbin/traceroute 主机IP地址 //显示从本地到目标IP所经过的所有路由器
七、文本编辑器 vi 的使用简介
古希腊克里特岛迷宫里有一个牛头人身的怪物米诺陶洛斯,如果不是美女公主阿里阿德涅赠送给英雄忒修斯一把魔剑,英勇的忒修斯还真奈何不了这牛头人身的怪物。
vi编辑器就是Unix系统赋予我们的魔剑,它是一款强有力的文本文件编辑工具。对初学者而言,常因其特殊的使用方法,而不得径门而入;对已经在使用 vi 的操作者来说,也常因对 vi 的不够熟悉与了解,而无法发挥出 vi 强大的编辑能力。以下将介绍vi 的基本使用方法。
vi 提供了两种操作模式:文本输入模式和命令模式,前者用于文本输入,后者用于输入控制指令。要启动vi进行文本操作,用户可在Shell提示符后输入如下命令:
vi 文件名
如果该名称的文件不存在,则系统会自动创建该文件。用户进入vi编辑器后,便自动处于命令模式,此时键入的任何字符皆被视为指令。此模式下可对文本进行删除、替换、拷贝、移动等操作,而对文本进行操作的前提是输入文本,那就先让我们进入输入模式吧。文本输入模式的进入,有以下的指令可供使用:
a |
将在光标所在位置之后插入文本 |
A |
将在光标所在行末插入文本 |
i |
将在光标所在位置之前插入文本 |
I |
将在光标所在行的第一个非空字符前插入文本 |
o |
将在光标所在行的下一行开始插入文本 |
O |
将在光标所在行的上一行开始插入文本 |
俗话说:“仙人打鼓时有差,脚步踏错谁人无。”在输入文本过程中,出现差错在所难免,但在vi编辑器中可不像在Word中那样能使用backspace或delete键来删除差错之处,而是首先应该按“ESC”键进入命令模式,然后可利用下面的指令移动光标位置进行准确定位:
k |
上移一个字符 |
j |
下移一个字符 |
h |
左移一个字符 |
l |
右移一个字符 |
行号G |
光标移到该指点行(如1G表示光标移到第一行) |
G |
光标移到文件结尾 |
接着就可以使用下述指令进行删除或替换操作了:
x |
删除光标所在字符 |
X |
删除光标所在的前一字符 |
s |
删除光标所在的字符,并进入输入模式 |
dd |
删除光标所在行 |
nd |
删除编辑器第n行的所有字符(n代表具体数字,下同) |
ndd |
删除从光标所在行开始往下的n行 |
:n,md |
删除从指定的n到m行之间的所有字符(如::5,10d 将会删除编辑器中从第5行开始至第10行的内容) |
D |
删除光标所在处到行尾的字符 |
r |
用跟在此指令之后的字符替换光标所在的字符(如:ra 是以 a 替换光标所在的字符) |
C |
替换从光标到行尾的内容 |
cc |
替换整行的内容 |
“Ctrl + C”、“Ctrl + X”、“Ctrl + V”这几个组合键对于Windows用户来说是再熟悉不过了,在vi编辑器当然也具备了一般编辑的拷贝、移动、粘贴功能,下面就让我们来试试吧!
yw |
拷贝当前光标所在处的词 |
yy |
拷贝当前光标所在行的所有字符 |
P |
在光标所在行的下一行粘贴 |
:i,jcok |
将第i行至第j行之间的文本拷贝到第k行之后(此处i、j、k分别代表不同的数字) |
:i,jmok |
将第i行至第j行之间的文本移动到第k行之后(此处i、j、k分别代表不同的数字) |
上列表中第4、5项如::10,20co30 将第10行至第20行的文本复制到第30行之后;:10,20mo30 将第10行至第20行的文本移动到第30行之后。
在完成所有的编辑工作之后,大家可要记得存盘退出vi 编辑器。在命令模式下使用下述指令:
:w |
存盘 |
:w newfile |
存盘成新的文件 |
:wq |
存盘并退出vi |
:q |
退出vi,若文件被修改过,则会被要求确认是否放弃修改的内容。 |
:q! |
不存盘并强行退出vi |
下面再介绍一些较常使用的指令:
~ |
改变大小写 |
u |
取消上次操作,即复原执行上一指令前的内容 |
/字符串 |
从当前行往下查找指定的字符串 |
n |
往下继续查找下一个指定的字符串 |
?字符串 |
从当前行往上查找指定的字符串 |
N |
往上继续查找下一个指定的字符串 |
:r file |
将某文件的内容插入到光标位置 |
J |
将光标所在行与其下一行连接起来,即下一行文本移动至光标所在行的末尾 |
:set nu |
让编辑器自动显示出每一行的行号 |
:set nonu |
取消显示每行前的行号 |
对以上所列指令用户只有稔熟在心,才能熟练自如地使用vi编辑器。在此基础之上,大家可以参考其它相关资料来掌握vi编辑器的一些更高级的指令。在后续关于Unix平台上程序开发的介绍中,大家将更能感受到vi编辑器的重要性。
八、环境变量及其它设置
在中医理论中,纵向叫‘脉’,横向叫‘络’,任督二脉正好是在人体的前后中心,前面是任脉,后面是督脉,是人体的子午线,因此在金庸的武侠小说里,想要练成上乘的功夫,首先就是要打通任督二脉。环境变量就是Unix系统中的任督二脉,那就让我们来打通它吧!
在介绍环境变量之前,我们先来了解一下变量这个概念。变量顾名思义就是值会变化的量,在使用变量之前必须先进行定义,变量名可以是任何符合命令规则的字母、下划线和数字的组合。对于为变量赋值,在csh与bash中的操作方式会略有不同。在csh中为变量赋值的格式如下:
setenv variable value
在bash中可以使用赋值操作符“=”来为一个变量进行赋值,格式如下:
variable=value
export variable
注意在“=”的周围不应该有任何的空格,使用export命令是为了使此变量在所有嵌套的Shell中都有效。一旦为一个变量赋值之后,就可以通过在变量名之前放置“$”来引用该变量的值了。如果想要查看某个变量的值,则可以使用echo命令,命令格式为:
echo $variable
如在csh中键入如下命令,将当前系统的主机名赋值给变量WTO,并输出变量WTO的值:
setenv WTO `uname –n`
echo $WTO
在bash中的操作方式如下:
WTO=` uname –n`
export WTO
echo $WTO
变量的使用用途较广,经常的用法是将其作为某个命令的参数。如将某一经常用到的目录路径名赋值给一个变量,这样就可以避免一遍又一遍地反复敲入同样的内容了。看下面一个例子,要将当前目录中的文件myfile1、myfile2拷贝到目录/home/anray/mydocument中,就可以使用如下的命令(以bash为例):
mydir=/home/anray/mydocument
cp myfile1 $mydir
cp myfile2 $mydir
如果想了解所有已定义的变量情况,则可以使用set命令。当用户不再需要某一个变量时,可以用unset命令来删除此变量,格式如下:
unset variable
值得注意的是,当前所定义变量的作用域范围是当前正在使用的Shell环境,即一旦退出Shell后再次登录,则此前所设置的所有变量都将失效。如果需要再次使用这些变量的话,都必须重新进行定义。
要想使定义的变量在每次登入系统时都有效,则需将其定义成为环境变量。环境变量可以用于定制用户的工作环境,即使用环境变量可以保存用户对系统进行设置的信息。环境变量被定义在“初始化文件”中,csh的初始化文件是.cshrc文件,bash的初始化文件是.bashrc(或.bash_profile,两者等效)。在每次系统启动时,系统会自动读取初始化文件中的内容来配置相应的工作环境,常见的环境变量有HOME、PATH、SHELL等。HOME变量的值是用户主目录的路径名。PATH变量的值包含了各种命令所在目录的路径名,路径名之间用冒号隔开,当用户执行某一命令时,系统就将会自动在这些目录下查询此命令并执行,若未查询到则会提示命令没有找到。SHELL变量的值代表了用户登陆系统时默认的Shell环境。当然用户也可以定义自己所需的环境变量,定义方法与普通变量定义相同,两者的不同之处在于环境变量被定义在初始化文件中。通常在定义环境变量之后,需要重新进入系统才会生效。如果想在不重启系统的情况下立即使当前的配置生效,csh中可以使用如下的命令:
source .cshrc
bash中可以使用如下的命令:
. .bashrc
关于使用Java、Oracle、CVS、Tomcat等时应该定义的环境变量,计划在后续的系列文章中陆续介绍,此处就先行略过。要想查看系统已定义的所有环境变量的情况,可以使用setenv命令。
下面我们再来介绍一下Unix系统中的一些其它设置。
1、计划任务的设置
Unix系统允许在指定的时刻执行指定的任务,这一功能是靠cron进程来实现的。cron进程会检查系统的计划任务文件,并在指定的时间执行这些指定的操作。计划任务文件内容格式如下:
min hour day month day_of_week command
0-59 0-23 1-31 1-12 0-6(Sunday=0)
计划任务文件由若干行组成,每行表示一个任务。每行由若干字段组成,字段间用空格分开。每行中字段分别代表:分、时、日、月、星期、要执行的命令。每个字段取值举例:
各字段取值举例 |
说明 |
* |
表示任何时间 |
1,3,4 |
表示离散数字,即一系列点值 |
1-5 |
表示从1到5,即一范围 |
例如:
30 0 * * * /usr/tmp/a.txt
0 7 * 1,3,6,8 1-5 /usr/tmp/makefile
第一行表示在每天的午夜0:30启动/usr/tmp/a.txt文件运行,第二行表示每当1、3、6和8月的周1到周五,启动/usr/tmp/makefile文件运行。
计划任务文件是不能直接通过vi等编辑工具进行修改的,要对计划任务文件进行操作可使用crontab命令。crontab命令的常用格式如下:
crontab命令举例 |
说明 |
crontab -l |
显示计划任务文件的内容 |
crontab –e |
编辑计划任务文件的内容 |
crontab myfile |
用myfile文件内容覆盖原计划任务文件内容 |
crontab -r |
删除现有的计划任务文件 |
需要补充的是,crontab –e命令在默认情况下会使用编辑器ed来编辑计划任务文件。此编辑器的操作非常烦琐,因此最好是通过设置环境变量EDITOR来指定编辑器,方法如下:
setenv EDITOR vi
此外,也可通过先将计划任务文件的内容读入某一临时文件,编辑完成后再覆盖原计划任务文件的方式来修改计划任务。
[例] 在原计划任务文件基础上增加如下任务:每月1日凌晨3时运行/usr/tmp/run程序。
解:
(1) 运行 crontab -l > temp
(2) 对temp文件进行编辑,追加下面一行:
0 3 1 * * /usr/tmp/run
(3) 运行 crontab temp
2、别名的设置
可以使用alias命令来为一个命令创建一个别名,它的命令格式如下:
alias alias-name value
比如,熟悉的DOS的用户可能会一下子不习惯ls这个命令,那么就可以使用如下的方法来为ls命令取个别名:
alias dir ls
此外,还可以用一个别名来代替一个命令及它的参数,这样就可以简化常用的操作命令以便使用。不过这时需要用单引号将命令及其参数括起来,如:
alias dir ‘ls –l’
若想查看已定义的所有别名的别名表,则直接使用alias命令即可。当想删除某个别名时,则可使用unalias命令,格式如下:
unalias alias-name
3、命令历史设置
在Unix系统中,history程序会自动保留用户最近所使用过的命令。历史表中的命令从1开始编号,上限为所设置的保留个数,默认值是500。我们可以重设此保留个数,如:
set history=30
上述操作设定命令历史表长度为 30,即可记载已执行过的30个命令,可通过使用history命令查看此30个命令记录。使用“!n”命令可以执行历史表中所记录的第n个命令,“!!”则是重复执行前一个命令。
九、Shell脚本编程
在执行某个具体任务的时候,有时可能需要把几个Unix命令结合起来一起使用。如果这样的操作较为频繁,则可以考虑将这些命令放入一个文件中。那么每次使用时只需执行此文件即可,这样的文件就被称为脚本文件。
我们先来看一个简单的例子。首先使用vi创建一个名为lsjava的文件,在文件中输入如下内容:
pwd
cal
date
ls *.java
保存退出。由于默认情况下vi编辑器创建的文件仅有读和写权限,因此需要使用chmod命令来使脚本文件具备可执行权限,使用命令如下:
chmod u+x lsjava
在shell提示符后输入脚本文件名并回车,将可执行此脚本文件中的命令了,即先显示当前所处的工作目录,再显示出日历和日期,最后列表显示出当前目录下所有以“.java”为后缀名的文件。这样,脚本文件名就变成了一个新的shell命令。使用此种方法,我们就可以设计并创建自己的命令了。要补充说明的是,如果是在bash中,我们就无需更改脚本文件的权限,使用如下的命令格式即可执行此脚本文件:
. lsjava //此处的点号“.”表示执行
像其它的Unix命令一样,在命令行中调用一个脚本时,也可以在此脚本名后输入参数。这样在脚本文件中就可以接收来自命令行中的参数信息,并将此作为脚本文件中某命令的参数。命令行中的参数通过使用“$”操作符和参数序号来引用,参数以“1”开始顺续引用,第一个参数用$1来引用,第二个参数用$2来引用,以此类推。每次还可以引用多个参数,使用操作符“$*”即可表示引用所有的参数。此外,在脚本文件中,除了可以使用一系列的Unix系统命令外,还可以使用变量、算术表达式、条件选择、循环控制等来共同完成相应的任务。脚本文件功能强大,在处理较大的任务或需要循环执行某一个命令时可节省大量的时间。由于此部分涉及到编码,且内容较多,足可另写一本书,且又是非Unix初级使用者所必须掌握的知识,故在此不再赘述,请感兴趣的读者查阅相关的书籍与资料。
关于对Unix操作系统使用的基本介绍将就此告一段落。有智者曰:“人之知识,若登梯然,进一级则所见愈广。”本系列拙文仅作引玉之砖、铺路之石,若有关注与兴趣者籍此登梯而上,所见愈广,后能返得指教与辅导,则实为笔者遂愿之幸事!