导言
从大四开始接触linux,到现在从事运维工作,积累了不少shell脚本编程经验。为提高代码质量,重新学了遍shell。回过头来审视,发现过去对shell的认识仅仅停留在“unix命令批处理”这一层面,大为谬误。以下谈谈我对shell的再认识。
shell是什么?
shell,“壳”也。简单地说,Shell是处在内核(kernel)和用户(user)之间的,给用户提供一个交互式操作环境的一套程序。
shell,处于系统最外层,逻辑上包裹了内核(和系统调用层)。它为用户屏蔽了内核复杂的实现方法和系统调用函数,并向上提供了安全方便统一的交互式操作接口。
shell的工作流程是:接收用户输入请求,解释并执行(调用)相关命令,内核执行完毕后接收结果并返回给用户。
因此,有了shell这个操作接口程序,我们才得以操纵kernel,完成所设定的计算动作。广义地,一切能够让用户操作系统的交互环境,统称shell。所以gui也是一种shell。
shell编程是什么?
shell除了可以每次接收用户输入的命令并返回结果外,还可以把语句集成在一起,写成脚本(shell script),形成一个完成特定任务的"工具",这样就能够对定期性、重复性事务(比如定期检查邮箱、备份文件)实现管理。
shell是unix的第一个脚本语言,它沿袭了unix操作系统的设计风格:实用、简单、优雅(power cloaked in simplicity)。结合了延展性与效率,并不断被标准化和改良。
shell编程应该遵循如下软件工具的原则:
-
一次做好一件事情:这样设计、编写、调试、维护的成本将少很多,一次只做好一件事,永远只为一个用途和目标设计专用工具。
-
处理文本行,不要处理二进制数据:
-
文本是unix的通用格式,unix擅长处理文本文件,二进制数据计算用编译型语言完成;
-
使用正则:这么强大的工具,何乐不为?
-
默认使用标准输入和标准输出:能够轻松把写好的shell脚本作为管道的一部分整合到更大的功能中去;
-
避免输出:没有消息就是好消息,一个好的admin永远知道自己在做什么
-
让工具做困难的部分:现有的命令工具(grep,awk..)等可以满足大部分需求,不要重复造轮子
为什么要学shell
现在各个linux distribution的GUI已能够满足基本操作功能,但论及想更深入精细地操纵系统,发挥linux强大的功能,按需定制服务,shell无疑比这些花哨的图形界面更有支持力,并一直称职地扮演这个角色。
shell有如下优势:
-
GUI(KDE或GNOME)并不代表真正能够完全操纵系统,更不能代表了解系统,如果从KDE迁移到GNOME的环境,如果不会shell,还得从头学;shell是每个unix系统共有的;
-
bash遵守posix规范,移植性强,在redhat上写就的shell script可以轻松拷贝到freebsd上执行(或做极小改动);
-
shell开发效率高。通常能够在极短的时间内开发完成,可以简洁地表达复杂的操作。想象一下“查找并删除指定目录下超过30天的文件”用c写会多么痛苦。
-
修改方便,使用文本编辑器打开修改,并重复调试、执行。
-
无招胜有招,充分利用系统工具。shell本体只是一系列内建命令和关键字的集合,但它能够搭配工具程序(grep,tr,sed,awk)等,产生无穷的组合。所以,这个层面上,shell更像是命令工具集的"组织者"和"调度者"。
shell的适用场合是什么?
不同的程序语言满足不同的特定需求,任何一种工具都有它的适用范围,总不能让姚明去练体操吧:)
-
shell非常适用于文本文件、字符串的操作,不适合大规模计算,二进制数据处理的应用场合;
-
shell不内置支持hash(zsh支持,bash用技术手段可以实现伪支持);
-
shell不内置支持并发(用技术手段可以实现伪并发);
-
shell开发速度快,但执行效率不如C编译型语言快速;
附:解释型语言和编译型语言的区别
运行方式:
-
编译型语言(c,pascal)需要将文本文件格式的源代码(source code)用编译器(compiler)转换成目标代码,只要有这份目标代码,程序就可以执行;
-
解释型语言(shell,perl,python)由解释器(interpreter)直接读入源代码,解释一句执行一句(解释且执行),解释型语言不直接产出目标码。解释器通常是编译型语言写成的。
用途:
-
编译型语言偏向底层,操作内存地址、字节,擅长中大型的,用于复杂计算的程序,开发慢,运行效率高;
-
解释型语言更高级,轻易处理目录、设备、文件等对象。适用于小型的,灵活的日常管理需求,开发速度快,往往执行效率不高;
参考资料
shell脚本学习指南 O'reilly Preface and Chapter 1
阅读(1338) | 评论(0) | 转发(0) |