shell ??昨天看书,看到一些词,有B shell .C shell .K shell,请问这些都是啥?它们和shell有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell ??昨天看书,看到一些词,有B shell .C shell .K shell,请问这些都是啥?它们和shell有啥区别?相关的知识,希望对你有一定的参考价值。

shell是用户和操作系统之间的接口, shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
而你说的B shell, c shell , k shell是具体的shell实现方式。 它们的语法有不同,但功能都大致差不多。

它们之间的关系:
就象“手机“是一类物品的统称, 而nokia手机, 三星手机则是不同品牌的手机实体。
参考技术A 都是shell……只是不同的版本而已!如Sun默认的是C shell,商业上常用K shell以及TCSH,每种shell都有各自的特点……linux常用 Bash shell…
用户是利用shell控制kernel来间接控制硬件……
你的听明白了吗?
参考技术B 这些都是shell的分类,这要追溯Unix 和Shell的历史了,总的来说现在的Unix有两个分支,一个是AT&T UNIX 一个是BSD Unix, 而导致shell也有了两个大的分支,每个分支又有自己的衍生,每一种shell都有一个自己的特性,也正因为有了很多shell分类的出现,所以在POSIX标准里面规定了所有的Unix系统上都必须包含一个最小子集的shell,避免太大的差异

Bash源码分析


点击上方 “公众号” 可以订阅哦!


引言

Bash源码分析(1)


Bash这个程序作为一个linux的用户,用的实在太频繁了,但一般局限于会用就结束了,一直没机会研究bash本身的原理。因工作需要,调试一个bash的cpu冲高问题,趁此机会对bash的源码做了一些研究,希望能对大家有点帮助。


 linux的各种主流shell介绍

Bash源码分析(1)


现在一般使用的shell有sh,bash和csh这几种,我们这里主要说的是bash,其他shell的源代码逻辑也差不多。


bash使用到的主要数据结构介绍

Bash源码分析(1)

1

COMMAND


Bash源码分析(1)


COMMAND是所有数据结构的纲,从这里可以看出一个bash实际能执行的语句有14种,分别位for,case,while,fi,connection,simple_com,function,group,select,arith,cond,arith_for,subshell,coproc,其中select,arith,cond,arith_for这4个命令需要打开对应的编译开关之后才能执行。


除了下面的这个union外,另外几个属性分别对应命令类型,行号和执行环境控制参数。其中控制参数有很多,每个控制参数占用一个bit位,包括是否启动子shell,是否忽略exit值等。


Bash源码分析(1)


这些flag可以在bash启动shell脚本时设置,或者在shell脚本内部调用set指令来设置,一般用户不怎么关注,高阶用户可以看看:


Bash源码分析(1)


2

FOR_COM


Bash源码分析(1)


FOR_COM对应的shell语句是for name in map_list; do action; done


从结构体定义可以看出,除了和COMMAND相同的flags和行号外,for语句是有一个变量名,一个列表和一个递归的COMMAND组成的,实际for循环执行过程中也是将列表中的每个元素拿出来赋值给变量名,并执行action中的脚本段。


从这里的flags,可以看出,每条命令的flags是可以单独设置的,本条命令设置的控制参数可以不影响其他命令的控制参数。


3

CASE_COM


Bash源码分析(1)


对照下面的脚本,可以看出,先判断一个变量,变量判断晚走到复合语句clauses,注意clause最终实现的时候是一个单向链表,链表中每个元素由一个样式的列表和一个执行体action来组成。


Bash源码分析(1)


bash脚本的执行过程分析

Bash源码分析(1)


一个环境上多个sh的cpu占用达到99%,但实际通过ps看,这个sh并没有带任何参数,如果想要知道这个sh在干什么活,为何会一直冲高,还是gdb调试一下比较靠谱(还有一种可选的方法是不断的敲 cat /proc/*/stack 来反复查看堆栈,多敲敲之后总能抓到几次上下文,其中*换成对应进程的pid)。


通过下面的调试,可以看到当前执行是一个简单命令(cm_simple),通过p *command->value->Simple->words->word 看到当前执行的简单命令在字符串是true。


Bash源码分析(1)


重新运行,可以看到又跑到了一个简单命令,其命令是"i=i+1"(汗)。


Bash源码分析(1)


通过shell的进程号,查询进程的上下文,发现是从另外一个虚机链接过来的ssh,咨询环境负责人,该虚机是跑测试用例的,之前跑的测试用例不知道为何没有正常停止,测试用例确实就是简单的一行命令:


Bash源码分析(1)

Bash源码分析(1)


未完待续……

Bash源码分析(1)


以上是关于shell ??昨天看书,看到一些词,有B shell .C shell .K shell,请问这些都是啥?它们和shell有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

shell学习1

linux_shell 编程学习-初识she'll

Linux shell之数组

学习需要不断积累

shell环境

shell中的source和直接执行sh的区别