讲linux shell,从广义来看是linux kernel外的一个应用程序,为了避免普通用户直接操作内核,提供了这么一个“壳”,它提供了一种类似于桥梁的作用,把用户输入的各种各样的命令,如文件管理,磁盘管理,网络管理等的命令,转化成内核可以理解和操作的内容。狭义来讲shell可以把它看做是一门编程语言,通常来讲编程语言分为2类一类是编译型的语言,一类是解释型的语言。c,c++就是编译型的语言,而python和shell就是解释型的语言,也可以叫做脚本语言。编译型的语言执行快,但需要把源码转化为二进制文件执行,而解释型的语言,更为灵活,跨平台性好可以去做一些小工具之类的东西。

做个不恰当的比喻,从某个角度来看(当然可以说是错误的角度): windows---- dos----bat linux----shell----shell脚本

学习shell需要去了解一些linux unix等的发展历史。并且了解发展过程中出现的软件自由基金会,GNU,GPL,LGPL等。 linux准确来说是一个内核,是芬兰大神linus在unix和minix的基础上开发出来一种新内核,而我们现在所说的linux,更多是把linux内核和GNU的一些常用软件结合在一起的linux 操作系统。而这些GNU里面的软件就有gcc,bash shell这样的常见软件。

unix 3大shell bourne shell :AT&T C shell :Berkeley korn shell:AT&T linux常用的shell bourne again shell TC shell

我们也可以通过 /etc/shells查看系统支持的shell 经常使用debian系 ubuntu一类的朋友需要关注dash和bash的差别

dash是精简的bash,执行更快,但功能会少一些,一些bash支持的语句在dash下就会报错,如let i++, ehco -n ‘xxxx’的option n就无法识别等等。 如果觉得dash不好就改一下/bin/sh的链接就好了。或者用bash去执行脚本。

shell执行的过程 (1)读取输入并解析命令行 (2)给特殊字符赋值 (3)建立管道、重新定向和后台进程 (4)处理信号 (5)建立可执行程序

系统启动和登录shell /bin/login /etc/passwd 涉及到的系统调用 fork exec wait exit

shell下执行一般分类2类情况 一类是内建命令,不会fork新进程 一类是外部命令,要么是可执行程序,要么是脚本,会fork新进程 内建命令的执行会影响当前shell(父shell)的状态,而执行外部命令则不会影响父shell的状态。