3.3 Shell基础知识
在Linux系统中,Shell是最常使用的程序,其主要作用是侦听用户命令、启动命令所指定的进程并将结果返回给用户。本节主要介绍Shell和bash。
2.3.1 Shell简介
在AT&T工作的Dennis Ritchie和Ken Thompson两人在设计UNIX操作系统的时候,想要为用户创建一种与UNIX系统交流的方法。那时的操作系统带有命令解释器。命令解释器接受用户的命令,然后解释它们,这使得计算机可以使用这些命令。
但是Ritchie和Thompson想要的不只是这些功能,他们想要提供比当时的命令解释器具备更优异功能的工具。这导致了Bourne Shell(通称为sh)的开发,由S.R.Bourne创建。自从Bourne Shell出现以后,其他类型的Shell也被一一开发,比如C Shell(csh)和Korn Shell(ksh)。
Shell接收用户命令,然后调用相应的应用程序,同时它还是一种程序设计语言,是系统管理维护时的重要工具。 作为命令语言,它交互式地解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令。作为程序设计语言,它可以定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构(循环和分支)。
Shell命令重新初始化用户的登录会话。当给出该命令时,就会重新设置进程的控制终端的端口特征,并取消对端口的所有访问。然后Shell命令为用户把进程凭证和环境重新设置为缺省值,并执行用户的初始程序。根据调用进程的登录用户标识建立所有的凭证和环境。
Linux 系统对Shell的处理采用独立、自由、开放的方式,因此Shell 的种类相当多,目前流行的Shell 有sh、csh 、ksh、tcsh 和bash等。大部分Linux系统的默认Shell类型为bash。
2.3.2 bash简介
bash(Bourne-Again Shell)最早是在1987年由布莱恩·福克斯开发的一个为GNU计划编写的UNIX Shell。bash目前是大多数Linux系统默认的Shell,它还能运行于大多数UNIX风格的操作系统上,甚至被移植到了Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。
bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经过修改就可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne内置命令的脚本才需要修改。很多bash的命令语法来自ksh和csh,比如命令行编辑、命令历史、目录栈、$RANDOM变量、$PPID变量以及POSIX命令置换语法。
对于刚接触Linux系统的人而言,bash就相当于Windows系统上的DOS命令提示符。bash可以交互操作,也可以进行批处理操作,而且bash的开发具有较强针对性,因而其功能及易用性比DOS命令提示符强得多。
3.3.3 bash命令
当登录Linux系统或打开一个Linux终端窗口时,首先看到的是bash Shell提示符。Linux系统的标准提示符包括了用户登录名、登录的主机名、当前所在的工作目录路径和提示符号。
例如以普通用户zhangsan登录名为rhel的主机,他的工作目录是/home/zhangsan,如下所示。
[zhangsan@rhel ~]$
以root用户登录系统的提示符如下所示。
[root@rhel ~]#
除了不同的用户名外,提示符号由“$”变成了“#”。根据bash的传统,普通用户的提示符以“$”结尾,而超级用户以“#”结尾,提示符的每个部分都可以定制。
要运行命令的话,只需要在提示符后键入命令,然后再按回车键即可。Shell将在其路径中搜索这个命令,找到以后就运行,并在终端里输出相应的结果,命令结束后,再给出新的提示符。比如下面这个示例。
[zhangsan@rhel ~]$ whoami
zhangsan
//显示当前登录Linux系统的用户是zhangsan
[zhangsan@rhel ~]$
一个Shell命令可能含有一些选项和参数,其一般格式为:
[Shell命令] [选项] [参数]
下面举一个例子来详细描述Shell命令格式。
[root@rhel ~]# ls-l /root
其中“-l”是命令ls的一个选项,而/root则是参数。所有选项在该命令的man手册页中都有详细的介绍,而参数则由用户提供。选项决定命令如何工作,而参数则用于确定命令作用的目标。
选项有短命令行选项和长命令行选项两种。
下面这个示例就使用了短命令行选项。
[root@rhel ~]# ls-l /root
下面两种方法实现一样的效果。
[root@rhel ~]# ls-l-a /root
[root@rhel ~]# ls-la /root
下面这个示例就使用了长命令行选项。
[root@rhel ~]# ls--size /root
在Linux系统中,命令可以分为以下两大类。
● bash 内置的命令。
● 应用程序。
如果是bash内置的命令,则由 bash 负责回应。 如果是应用程序,那么Shell会找出该应用程序,然后将控制权交给内核,由内核执行该应用程序,执行完之后,再将控制权交回给Shell。
使用which 命令可以查看哪些命令是 bash 内置的命令,哪些是应用程序。
例2.14:查看echo和ls命令。
[root@rhel ~]# which echo
/usr/bin/echo
[root@rhel ~]# which ls
alias ls='ls--color=auto'
/usr/bin/ls