Table of Contents
Shell是UNIX系统的用户接口,它接受用户的指令,并将它翻译成操作系统可以理解的命令,最后将结果返回给用户。简单说就是用户和内核打交道的界面。在UNIX发展的历史中,出现了几种shell,第一个主要的shell是Bourne shell(以其发明者Steven Bourne命名),它始于1979年,包含在unix第一个流行版本版本7中,在系统中称为“sh”。另一个shellC shell,在系统称为csh,它由Berkeley的California大学的Bill Joy编写,它首次发布于1981年的UNIX Berkeley Software Distribute(BSD)中。C shell的名称来源于其语句命令与C语言的相似。还有一个使用较多的shell是Korn shell,它是一个商业产品,类似于bash。以下重点介绍一下bash。其它的shell大家可查阅相关资料。
Bash是GNU系统的标准shell,正式发布于1988年11月10日,Brain Fox编写了bash的最初版本,1989年初,Chet Ramey加入开发,负责大量的故障调试及加入许多有用的特性。现在bash由Chet Ramey负责维护。我们可免费从FSF(Free Software Foundation)得到0.99以上的版本。现在最新的版本是2.05b,它提供了作业控制、命令行编辑模式、自定义函数、高级I/O等先进功能。可以用bash的命令行选项-version或打印环境变量BASH_VERSION的值来获得版本号。
优秀的管理员也是懒惰的管理员,他们喜欢用shell帮助他们自动完成各种管理工作。Linux系统很多服务都是通过shell脚本来启动,通过查看这些脚本,你可以了解服务的启动过程,从而为故障论断和系统优化做好准备。
Bash的用户接口也就是我们经常说的字符界面,这是我们与系统交互的主要环境,我们可通过这个接口管理我们的系统。在系统引导时,第一个需要运行的进程是init,由init再衍生出一个getty终端进程,该进程打开一个终端窗口,提供标准输入、标准输出和标准错误。然后执行程序/bin/login,login程序提示输入密码,加密并验证密码。通过验证后系统进入登录shell,也就是bash。不同的登录shell可在passwd文件设置。bash会通过几个配置文件来初始化用户环境。首先bash会查找/etc/profile,并执行其中的命令,初始化系统级别环境。然后在用户目录下查找.bash_profile文件,并执行里d面的命令,初始化用户级别的环境。用户级别的设置可覆盖系统级别设置。最后会执行.bashrc用户环境设置文件,这时,默认提示符美元符号将显示在屏幕上。
进入bash后,系统可根据你的配置生成一系列的环境变量,这些环境变量可用export命令显示。下面是一些常的环境变量:
$LOGNAME,当前登录的用户名。
$HOME,当前用户的主目录。
$PATH,当前用户的命令搜索路径。
$LANG,当前系统的语言环境。
$TZ,时区
$MAILCHECK,检查新邮件的间隔,单位是秒。
$PS1,命令行提示符。
$PS2,二级命令行提示符,也就是当你的命令行很长,在一行写不下,转到第二行时出现的提示符。
$PWD,当前目录。
Linux以树状结构组织文件和目录,目录可以包含文件,也可以包含其它目录。目录的最高层是根目录"/",其它所有文件和目录都是挂在根目录下,形成一个倒挂的目录树。
使用bash shell的cd命令可在目录树中移动,当前停留的位置叫工作目录或当前目录,可用"."表示。每个用户在/home目录下都有一个与用户名相同的目录,叫用户主目录。可用"~"符号表示,".."表示上一级目录。
jims@localhost:~$ #位于jims用户的主目录 jims@localhost:~$ cd . jims@localhost:~$ #没变化 jims@localhost:~$ cd .. jims@localhost:/home$ #移动到上层目录 jims@localhost:/home$ cd ~ jims@localhost:~$ #回到用户主目录 jims@localhost:~$ pwd #显示当前目录 /home/jims
在bash shell环境下,我们可用通配符来简化命令输入。
?,匹配任意单个字符。
*,匹配任意字符串。
[set],匹配set中的任意字符。[!set]是取反操作,匹配不在set中的任意字符,如:
[a-z] 匹配所有小写字符 [0-9] 匹配所有数字 [akz] 匹配a,k,z三个字符 [.,;] 匹配句点,逗号和分号 [!abc] 匹配除a,b,c之外的所有字符
下面是几个命令示例:
jims@localhost:~$ ls *.py #显示当前目录下所有以.py结尾的文件 jims@localhost:~$ ls *.[cho] #显示当前目录下所有以c,h,o结尾的文件 jims@localhost:~$ ls ??? #显示所有文件名为三个字符的文件
大括号"{}"可用于扩展任意字符串,如:
localhost:~/python# echo a{a,b,c}a aaa aba aca
我们也可用大括号做为通配符使用,如:
jims@localhost:~$ ls *.{c,h,o} #效果同ls *.[cho]
常用数据过滤命令
cat,将输入复制到输出。cat是"catenate"的缩写,是连接在一起的意思。
grep,从输入中检索字符串。
sort,对输入进行排序。
cut,从输入中抽取列。
sed,对输入进行编辑。
tr,对输入进行转换或删除操作。
使用"<"和">"可实现I/O重定向功能,如:
$ ls > filename #输出重定向到filename文件,也就是生成一个filename文件,内容为ls命令执行的结果。 $ grep < filename #grep的命令参数从filename文件读取。
使用"|"可实现管道(pipeline)操作,管道操作可以把一个命令的输出重定向到另一个命令的输入,而不是文件,如:
$ ls -l | more #先进行ls -l操作,再对操作结果进行more操作
bash shell允许在一个会话期间同时运行多个命令,正常情况下所有命令在前台运行。只有在一个命令运行完后才能输入一个命令。但如果我们在运行命令时在命令后加一个"&"符号,则该命令将转入后台运行,我们马上获得shell终端控制权,可输入另外一条命令。这种在后台运行的命令叫后台作业。后台作业主要用在一些需花很长时间来运行的命令上,如解压一个大的压缩文档。
$ tar zxvf xen.tar.gz& [1] 2547
使用jobs命令可以查看后台作业状态。
在bash中,有很多有特殊含义的特殊字符,下面是一个完整的列表: