shell的前世今生

1.shell是什么

        shell是一个命令解释器.是介于操作系统kernel与用户之间的一个绝缘层.准确地说,它也是一一种强力的计算机语言.一个shell程序,被称为一个脚本,是一种很容易使用的工具,它可以通过将系统调用,公共程序,工具,和编译过的程序粘合在一起来建立应用.事实上,所有的UNIX命令和工具再加上公共程序,对于shell脚本来说,都是可调用的.shell是一种应用程序,是一门解释型编程语言。

2.为什么需要shell

        由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为呢? 用户界面和命令行就是这个另外开发的程序,就是这层“代理”。回顾历史,在unix诞生时,还没有图形界面,所以这个代理层,在类unix下,shell专指命令行程序。 Shell 是一个应用程序,它连接了用户和 内核,让用户能够更加高效、安全、低成本地使用内核,这就是 Shell 的本质。 Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是随内核安装,开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux

3.shell是怎样工作的      

  ​​​​​​​        用户远程或者本机登陆的时候,就会创建一个shell进程,如上图是bash,为什么是bash而不是其他的shell呢,其实是在创建账号的时候指定的,useradd命令的格式是这样的:

useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name,其中 -s shell就是指定这个账号之后登陆的时候启用什么shell进程交互,设置好的信息会保存在/etc/passwd中

        bash启动之后,能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等。如果用户输入的指令执行时需要系统调用才能完成,比如读写文件,访问网络,那么shell就会去调用系统调用接口。

4.shell底层原理

4.1 指令种类:内建命令与外部命令。

        内建命令对于shell来说就是一次函数调用,而外部命令,则会创建一次子进程,它需要花费时间和精力来设置新的子进程的环境,所以外部指令的执行效率要比内建指令低。(如果将内建指令放在()中,那么将起一个子进程来执行)。

4.2 指令执行方式:前端执行与后台执行。

        指令最后跟&表示后台执行,本行指令单元会起一个子进程来执行,它有两种结束方式:一是父进程结束前他已经执行完毕,二是父进程退出时他还没有执行完毕,那么它会直接挂接到init进程下,父进程id为1。

 如果在()中直接用&,则会直接在init下创建一个子进程,

 4.3 输入输出重定向

        实际上就是unistd.h中的dup2函数,具体见bash源码文件redir.c的do_redirection_internal函数:

 4.4 管道符|

        

        管道符连接的程序队列叫做 pipeline,在man中这样说

        管道链路中的各个命令都是独立的子进程,前面进程的输出与后面进程的输入对接,整个链路的执行时间以最长的子进程时间为准,正常退出的话最后一条指令的退出状态就是整个链路的退出状态,除非中间出现pipefail

5.shell的分类

Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。 这是主流的

C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名

Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。

Bourne家族主要包括sh、ksh、Bash、psh、zsh;

C家族主要包括:csh、tcsh

bash: Bash与sh兼容,现在使用的Linux 就是使用Bash作为用户的基本Shell。

6.shell的使用场景

6.1 shell适合做什么

1)完全在系统之外做复杂程序的demo,初期可以验证可行性,避免直接用高级语言进行大规模的编程。比如与第三方的接口调试,直接curl或者wget可以验证对方的返回数据格式与参数要求,这时并不需要直接讲http模块集成在大系统中测试。

2)负责部分系统功能,由已经成熟的shell命令来完成一部分工作,可以大大提高工作效率,这一点比损失一部分性能更有吸引力,比如切割完成文件压缩,同步发送之类。

3)整个系统都由shell来调度执行,Shell编程遵从经典UNIX哲学:把复杂的问题分解成简单的小问题,然后再把各部分功能组合起来解决复杂问题。这样一个大系统可以分拆成各个模块,然后各司其责,子模块功能相对独立,可以很好地利用现有shell的成熟功能。

6.2 shell不适合做什么

1)跨平台的程序需求,当前windows与linux下的脚本执行机制不同,linux与unix下也有一些程序是不兼容的。

2)性能要求很高的需求,比如大数据的排序,浮点计算之类,shell的执行效率不如高级编程语言中的库函数,因为库函数的执行还在进程空间,而shell中调度执行会有进程间通信,性能有损耗。

3)特殊的函数库调用或者是系统调用,比如json处理库,socket编程,硬件直接存取。

4)大型系统逻辑模拟,比如游戏server,模拟玩家逻辑

参考文档:

linux shell为什么重要,为什么要有shell编程_橘右京-我爱你的博客-优快云博客

Shell是什么?1分钟理解Shell的概念!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值