<< Back to shouce.jb51.net

Chapter 2. Bash

Table of Contents

2.1. Bash的用户交互接口
2.1.1. 环境变量
2.1.2. 目录操作
2.1.3. 通配符
2.1.4. 输入/输出
2.1.5. 后台作业
2.1.6. 特殊字符
2.1.7. 控制键
2.2. 常用变量
2.3. 用户环境配置
2.3.1. .bash_profile、.bashrc、和.bash_logout
2.3.2. 选项

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脚本来启动,通过查看这些脚本,你可以了解服务的启动过程,从而为故障论断和系统优化做好准备。

2.1. Bash的用户交互接口

Bash的用户接口也就是我们经常说的字符界面,这是我们与系统交互的主要环境,我们可通过这个接口管理我们的系统。在系统引导时,第一个需要运行的进程是init,由init再衍生出一个getty终端进程,该进程打开一个终端窗口,提供标准输入、标准输出和标准错误。然后执行程序/bin/login,login程序提示输入密码,加密并验证密码。通过验证后系统进入登录shell,也就是bash。不同的登录shell可在passwd文件设置。bash会通过几个配置文件来初始化用户环境。首先bash会查找/etc/profile,并执行其中的命令,初始化系统级别环境。然后在用户目录下查找.bash_profile文件,并执行里d面的命令,初始化用户级别的环境。用户级别的设置可覆盖系统级别设置。最后会执行.bashrc用户环境设置文件,这时,默认提示符美元符号将显示在屏幕上。

2.1.1. 环境变量

进入bash后,系统可根据你的配置生成一系列的环境变量,这些环境变量可用export命令显示。下面是一些常的环境变量:

  • $LOGNAME,当前登录的用户名。

  • $HOME,当前用户的主目录。

  • $PATH,当前用户的命令搜索路径。

  • $LANG,当前系统的语言环境。

  • $TZ,时区

  • $MAILCHECK,检查新邮件的间隔,单位是秒。

  • $PS1,命令行提示符。

  • $PS2,二级命令行提示符,也就是当你的命令行很长,在一行写不下,转到第二行时出现的提示符。

  • $PWD,当前目录。

2.1.2. 目录操作

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                      

2.1.3. 通配符

在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]

2.1.4. 输入/输出

常用数据过滤命令

  • 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操作

2.1.5. 后台作业

bash shell允许在一个会话期间同时运行多个命令,正常情况下所有命令在前台运行。只有在一个命令运行完后才能输入一个命令。但如果我们在运行命令时在命令后加一个"&"符号,则该命令将转入后台运行,我们马上获得shell终端控制权,可输入另外一条命令。这种在后台运行的命令叫后台作业。后台作业主要用在一些需花很长时间来运行的命令上,如解压一个大的压缩文档。

$ tar zxvf xen.tar.gz&
[1] 2547              

使用jobs命令可以查看后台作业状态。

2.1.6. 特殊字符

在bash中,有很多有特殊含义的特殊字符,下面是一个完整的列表:

Table 2.1. 特殊字符

字符含义
~主目录
`命令替换
#注释
$变量表达式
&后台作业
*字符通配符
(启动子shell
)停止子shell
\转义或续行
|管道操作符
[]通配符集
{}命令块
;shell命令分隔符,作用是可在一行输入多条shell命令。
'强引用,引号内所有内容保持字面意思。
"弱引用,引号内某些内容保持字面意思。
<输入重定向
>输出重定向
/路径分隔符
?通配符,匹配单个任意字符
!取反操作

2.1.7. 控制键

通过控制键可以控制shell的行为,下面是一些常用的控制键。

Table 2.2. 控制键

控制键描述
Ctrl_C中止当前命令
Ctrl_D输入结束
Ctrl_\如果Ctrl_C无效,则中止当前命令
Ctrl_S禁止屏幕输出
Ctrl_Q开启屏幕输出
DEL或CTRL_?删除最后的字符
Ctrl_U删除整个命令行
Ctrl_Z暂停当前命令