学习新的事物,我认为要解决what、why、how三个方面。以shell为例,就要解决:
1、 什么是shell?
2、 为什么要用shell?
3、 怎么应用shell?
因为学习shell的时间不长,还是初步理解阶段,如果理解有误,欢迎留言指正。
记录的过程也是学习的过程,我想在记录的过程中会对问题有更深入的认识。记录不是照搬,要结合自己的认识体会。下面先总结一下前两个问题,第三个问题太多了,还没学完,而且需要在不断的编程实践中总结经验,才会有更为深入的认识,只总结一两点就是了。我认为前面两个问题解决好了,对第三个问题的用处是不言而喻的。
一、什么是shell
首先需要了解Linux的结构,理解shell处于一个什么层次,才能把握shell的含义。
Linux一般有3个主要部分:内核(kernel)、命令解释层(Shell或其他操作环境)、文件结构(file structure)。
1、内核是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序。
2、命令解释层
在kernel和用户之间,有操作环境提供操作界面,它可以描述为一个命令解释器,这一层称之为命令解释层,可以认为是一种接口,它的作用就是对用户输入的命令进行解释,再将其发送到内核。Linux存在几种操作环境,分别是:桌面(desktop)、窗口管理器(window manager)和命令行shell(command line shell)。Linux系统中的每个用户都可以拥有自己的用户操作界面,根据自己的要求进行定制。现在比较流行的窗口管理器是KDE和GNOME。
这样就比较清楚shell了:1)Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并且是把它送入内核去执行。2)制订用户环境,通常在shell初始化文件中作这种工作。例如:设置终端键及窗口特征;设置搜索路径、权限、提示等。3)shell可以用作解释编程语言。Shell程序也叫命令表,由在文件中列出的命令组成。
3、文件结构
文件结构是文件存放在磁盘等存储设备上的组织方法,主要体现在对文件和目录的组织上。目录提供了管理文件的一个方便而有效的途径。用户能够从一个目录切换到另一个目录,而且可以设置目录和文件的权限,设置文件的共享程度。
使用Linux,用户可以设置目录和文件的权限,以便允许或拒绝其他人对其进行访问。Linux目录采用多级树形结构。用户可以浏览整个系统,进入任何一个已授权进入的目录,访问那里的文件。
文件结构的相互关联性使共享数据变得容易,几个用户可以访问同一个文件。Linux是一个多用户系统,操作系统本身的驻留程序存放在以根目录开始的专用目录中,有时被指定为系统目录。用户可以创建自己的子目录保存自己的文件,可以很容易地把文件从一个子目录移到另一个子目录中去。
操作环境(shell)和文件结构一起形成了基本的操作系统结构。它们使得用户可以运行程序、使用系统以及管理文件。此外,Linux操作系统还有许多被称为实用工具的程序,辅助用户完成一些特定的任务。实用工具可分三类:
编辑器:用于编辑文件。
过滤器:用于接收数据并过滤数据。
交互程序:允许用户发送信息或接收来自其他用户的信息。
Linux的编辑器主要有:Ed、Ex、Vi和Emacs。Ed和Ex是行编辑器,Vi和Emacs是全屏幕编辑器。
Linux的过滤器(Filter)读取从用户文件或其他地方的输入,检查和处理数据,然后输出结果。从这个意义上说,它们过滤了经过它们的数据。Linux有不同类型的过滤器,一些过滤器用行编辑命令输出一个被编辑的文件。另外一些过滤器是按模式寻找文件并以这种模式输出部分数据。还有一些执行字处理操作,检测一个文件中的格式,输出一个格式化的文件。过滤器的输入可以是一个文件,也可以是用户从键盘键入的数据,还可以是另一个过滤器的输出。过滤器可以相互连接,因此,一个过滤器的输出可能是另一个过滤器的输入。在有些情况下,用户可以编写自己的过滤器程序。
交互程序是用户与机器的信息接口。Linux是一个多用户系统,它必须和所有用户保持联系。信息可以由系统上的不同用户发送或接收。信息的发送有两种方式,一种方式是与其他用户一对一地链接进行对话,另一种是一个用户对多个用户同时链接进行通讯,即所谓广播式通讯。
二、为什么要用shell
Linux 的图形化环境最近这几年有很大改进。在X Window系统下,几乎可以做全部的工作,只需打开shell提示来完成极少量的任务。然而,在shell提示下要比在图形化用户界面(GUI)下完成得更快。Linux的很多初始化文件和配置文件都是使用shell来编写的,要想真正的了解和使用Linux,就必须学习shell。所以我使用shell的目的比较简单,总结如下:
1、 能够理解Linux初始化和配置文件,更好地使用Linux。
2、 在shell下工作消耗少,速度快,效率高。
3、 嵌入式Linux下基本上使用命令行界面,有时需要编写一些shell脚本,以更好地运行。
三、了解一下shell的基本知识
1、shell的历史
在 AT&T 的 Dennis Ritchie 和 Ken Thompson 设计 UNIX™ 的时候,他们想要为用户创建一种与他们的新系统交流的方法。那时的操作系统带有命令解释器。命令解释器接受用户的命令,然后解释它们,因而计算机可以使用这些命令。但是 Ritchie 和 Thompson 想要的不只是这些功能,他们想提供比当时的命令解释器具备更优异功能的工具。这导致了 Bourne shell(通称为sh)的开发,由 S.R. Bourne 创建。自从 Bourne shell 的创建,其它 shell 也被一一开发,如 C shell(csh)和 Korn shell(ksh)。
当自由软件基金会想寻求一种免费的 shell,开发者们开始致力于Bourne shell 以及当时其它 shell 中某些很受欢迎的功能背后的语言。这个开发结果是 Bourne Again Shell,或称 bash。Red Hat Linux 包括几种不同的shell,bash 是为互动用户提供的默认 shell 。这个可以在/etc/passwd用户文本域的第7域中查看。
总结一下,目前主要有下列版本的Shell。
● Bourne Shell:是贝尔实验室开发的版本。
● BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的Shell。
● Korn Shell:是对Bourne Shell的发展,在大部分情况下与Bourne Shell兼容。
● C shell:是SUN公司Shell的BSD版本。
2、选择shell
可以通过阅读它们各自的使用手册来了解各自的详细情况。对于各种不同的shell的学习和使用,主要归结为从以下几个方面进行。
● 这种shell的内建命令都有哪些?
● 怎样进行任务控制,即后台处理?
● 这种shell是否支持命令行编辑?
● 这种shell是否支持命令行历史记录?
● 什么是它的重要的开机启动文件或者配置文件?
● 各个shell的重要环境变量有哪些?
● 可以使用什么样的命令行提示符?
● 支持什么样的编程框架?
3、Bash shell的激活
Bash最常见的激活模式是交互式和非交互式两种。
3.1 交互式激活
指其标准输入和输出都连接到终端上,有分为四种类型:login、非login、posix以及受限的shell。
3.1.1 当Bash作为login shell被激活时,它将依次读取并执行以下文件:
1)/etc/profile
2)~/.bash_profile, ~/.bash_login or ~/.profile: 读取第一个存在的可读取的文件
3)~/.bash_logout 退出登陆的时候。
如果配置文件存在但是不能读取,错误消息将会显示。一个文件不存在,Bash将搜索下一个。使用--noprofile选项激活Bash可以禁止其读任何初始化文件。
3.1.2 当Bash作为非login shell被激活时,它将读取并执行~/.bashrc,此文件通常指向 ~/.bash_profile:
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
使用--norc选项激活Bash可以禁止执行任何初始化文件,使用 --rcfile file可以指定执行的初始化文件。
3.1.3 当Bash作为posix模式被激活时,Bash会试着尝试尽可能遵循POSIX的shell标准。读取的文件:由变量 ENV 定义
3.1.4 当Bash作为受限模式被激活时,它除了禁止某些操作以外,其他行为于其他模式相同。受限操作有。改变目录,修改$SHELL和$PATH变量, 运行exec,以绝对路径运行程序以及使用重定向。Bash 1.x中不包含受限模式。
3.2 非交互式激活
主要用来运行Shell脚本。启动后,Bash检查$BASH_ENV变量,若定义, 这执行该变量指定文件中包含的命令。
Bash 的激活选项
-c string 该选项表明string中包含了一条命令.如 bash -c ls ~
-i 使Bash以交互式方式运行
-r 使Bash以受限方式运行
--login 使Bash以登录Shell方式运行
--posix 使Bash遵循POSIX标准
--verbose 使Bash显示所有其读入的输入行
--help 打印Bash的使用信息
--version 打印版本信息
--noprofile
--norc
--rcfile file
4、Bash shell的初始化文件
4.1 跨系统配置文件
4.1.1 /etc/profile
通常设置一些shell变量,如PATH、USER、MAIL、HOSTNAME、HISTSIZE。
4.1.2 /etc/bashrc
/etc/profile只是存放了shell环境和程序启动设置,而/etc/bashrc则包含了为shell函数和别名的跨系统定义。/etc/bashrc文件可能指向/etc/profile或者单用户初始化文件。
4.2 单独用户配置文件
4.2.1 ~/.bash_profile
用户可以增加额外的配置选项或者改变默认的选项。前面所用到过的环境变量的定制就是在这里进行的。从第3部分bash shell的激活也可以看出为什么在这里定制的生命存活期是永久的,就是在于每次登陆shell都会配置一次,而每次配置之后生命周期就是直到shell退出。
4.2.2 ~/.bash_login
此文件包含只有在登陆进系统的时候才执行的特殊设置,在没有~/.bash_profile的情况下,此文件会被读取。
4.2.3 ~/.bashrc
当使用一个非登陆shell,比如X窗口登陆进图形模式的时候,打开一个这样的窗口后,用户不需要用户名和密码,无需认证。此时bash会搜索~/.bashrc,所以也指向登陆时读取的文件,同时意味着不需要在多个文件中进行相同的设置。
4.2.4 ~/.bash_logout
包含了退出shell时的特别指令。
前面的初始化脚本在修改后,应该是在下一次登陆时初始化生效,不过可以使用source命令,使之立刻生效。格式:source <filename>
5、shell命令行处理
当在shell提示符下面键入一个命令,shell是如何识别并且执行的,这个参考放在资料收藏里的《详解Bash命令行处理》一文,对此就会有比较清晰的认识,很多疑惑也就会迎刃而解了。
下面就fork-and-exec机制和Bash shell支持的内建命令简单介绍一下。
5.2 内建命令
内建的命令包含在shell本身里面。当内建的命令的名字被用作一个简单命令的第一个词时,shell 直接执行那个命令,而不创建新的进程。内建命令在实现那些单独的程序不可能或者不便实现的某些功能时时很有必要的。
bash支持3种内建的命令:
Bourne Shell内建命令:
:, ., break, cd, continue, eval, exec, exit, export, getopts, hash, pwd, readonly, return, set, shift, test, [, times, trap, umask and unset
Bash内建命令:
alias, bind, builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit and unalias
特殊内建命令:
当Bash在POSIX模式运行,特殊内建命令和其他内建命令有3个方面的区别:
特殊内建命令在shell函数在命令查找期间先被找到。如果一个特殊内建命令返回一个错误状态,一个非交互shell就会退出。在命令完成后在该命令之前的赋值语句仍然在shell环境中起作用。
POSIX特殊内建命令是::, ., break, continue, eval, exec, exit, export, readonly, return, set, shift, trap and unset