Shell定义

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

关于解释器:

解释器(英语:Interpreter),又译为直译器,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位"中间人",每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。

linux命令有多重,可能是shell内建的,也可能是外部的命令,可以通过type -a 命令查看。

[root@localhost ~]# type -a cd

cd 是 shell 内嵌

cd 是 /usr/bin/cd

[root@localhost ~]# type -a mkdir

mkdir 是 /usr/bin/mkdir

[root@localhost ~]# type -a ll

ll 是 `ls -l --color=auto' 的别名

[oracle@localhost ~]$ type -a type

type 是 shell 内嵌

[root@localhost testsh]# which type

/usr/bin/which: no type in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。

注意:shell内嵌的命令是无法通过which找到的。

普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用"$"作提示符,对超级用户(root)用"#"作提示符。

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

shell种类(了解)

  • Bourne Shell:是贝尔实验室开发的。也就是sh。
  • BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell。兼容sh。
  • Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。
  • C Shell:是SUN公司Shell的BSD版本。
  • Z Shell:The last shell you'll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。

bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行。我们下面都是在介绍bash。

默认shell

每个用户通过终端登录后,会根据passwd文件中的配置,使用相应的shell。

如下:

[oracle@localhost ~]$ cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

zjf:x:1000:1000:zjf:/home/zjf:/bin/bash

oracle:x:1001:1001::/home/oracle:/bin/bash

redis:x:1002:1003::/home/redis:/bin/bash

mysql:x:992:990:MySQL server:/var/lib/mysql:/bin/bash

其中,/sbin/nologin代表这个账号是辅助账号,不会登录。所以没有shell配置。

 

最新文章

  1. 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分
  2. Deep Learning(1)-Introduction学习总结
  3. Android——GridView(网格视图)相关知识总结贴
  4. 读书笔记——Windows环境下32位汇编语言程序设计(6)使用浮点指令进行64位除法
  5. JSP Servlet 路径解析 路径设置
  6. Tomcate配置单向双向SSL
  7. 【POJ】【2449】Remmarguts' Date
  8. 转载SSIS中的容器和数据流—数据转换(Transformations)
  9. poj3264 线段树
  10. 类:初识类的事件(有点不明白,怎么普通Precedure可以赋值给TEvent)
  11. 正则表达式小试牛刀--匹配我的csdn博文标题
  12. 手机装linux系统
  13. container_of 的用法
  14. Android TCP/IP 扫盲教程
  15. 多台linux主机之间建立免密通信
  16. TCP的核心系列 — 重传队列的更新和时延的采样(二)
  17. 最短寻道优先算法----SSTF算法
  18. npm安装less和less-loadernpm或者stylus和stylus-loader
  19. opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量
  20. IDEA调用其它模块module的类方法

热门文章

  1. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
  2. Java学习笔记-网络编程
  3. SpringCloud学习(二)服务消费者(rest+ribbon)(Finchley版本)
  4. check_mysql.sh
  5. Netty如何支持三种Reactor
  6. 剑指offer6:旋转数组的最小数字
  7. 题解 P3627 【[APIO2009]抢掠计划】
  8. T100弹出是否确认窗体方式
  9. RSA加密-解密以及解决超长内容加密失败解决
  10. Spring实战(七)Bean 的作用域