前言

笔者也是刚接触Linux,很多概念也是一边查资料一边摸索着理解,下面有一些专业性的术语是来源于网络资源。
一些概念笔者本人也还理解得比较模糊,看似简单的东西,深入发掘也会发现并不简单,很多概念都是相互联系的,需要我们多实验多思考。有些概念,现在可能还理解得比较模糊,但长久累积后,再看又会有新的理解。加油!

什么是shell

早期的计算机并没有图形界面,我们只能通过一个一个的命令来控制计算机,这些命令有成百上千之多。

现在我们使用的操作系统(Windows、Mac OS、Android、iOS 等)都是带图形界面的,简单直观,容易上手。

图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。

真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。
用户界面和命令行就是这个另外开发的程序,在Linux下,这个命令行程序叫做 Shell。Linux即使没有图形界面,用户也可以通过shell与内核交互,发出指令从而操作系统内核进行相应的工作。

shell的英文解释是“外壳、贝壳”。它像一个外壳包裹在Linux内核的外层,如图所示:

Shell本身也是一个程序,它是用户使用Linux的桥梁。Shell既是一个命令解释器,又是一种程序设计语言。作为命令解释器,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。(用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。)

如果我们的命令或者应用程序不在命令行直接执行,而是通过用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本里面通常内置了多条命令,有的还包含控制语句,比如if和else的条件控制语句,for和select的循环控制语句等。这些内置在一个shell脚本中的命令通常是一次性执行完成,不会不停的返回信息给用户,这种通过文件执行脚本的方式称之为非交互方式。Shell脚本类似于windows下的批处理,但是它比批处理要强大一些。

shell虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。

可以说,shell使用的熟练程度反映了用户对Linux使用的熟练程度。

shell是如何工作的

或者说Shell 是如何连接用户和内核的?
(1)读取用户由键盘输入的命令行。

(2)分析命令,以命令名作为文件名,并将其它参数改造为系统调用execve( )内部处理所要求的形式。

(3)终端进程调用fork( )建立一个子进程。

(4)终端进程本身用系统调用wait4( )来等待子进程完成(如果是后台命令,则不等待)。当子进程运行时调用execve( ),子进程根据文件名(即命令名)到目录中查找有关文件(这是命令解释程序构成的文件),将它调入内存,执行这个程序(解释这条命令)。

(5)如果命令末尾有&号(后台命令符号),则终端进程不用系统调用wait4( )等待,立即发提示符,让用户输入下一个命令,转⑴。如果命令末尾没有&号,则终端进程要一直等待,当子进程(即运行命令的进程)完成处理后终止,向父进程(终端进程)报告,此时终端进程醒来,在做必要的判别等工作后,终端进程发提示符,让用户输入新的命令,重复上述处理过程。
Shell基本执行过程及父子进程之间的关系如图所示:

由上图可见,shell在解释命令的时候并不是自己亲自执行,而是派生子进程让子进程去完成这项工作,这样的好处是把风险交给别人,当指令的执行出现问题时不会影响到shell(影响到其他指令的执行)。shell不可以挂,shell 一旦挂就没有什么可以解释命令了。对我们而言shell为了保证自己风险最低,通过创建子进程进行命令行的解释工作。而shell自己只要去等就可以了。

shell处理输入的命令

在Linux中,有一些命令,例如cd是包含在shell内部的命令,这叫做内置命令;还有一些命令,例如cp、mv或rm是存在于文件系统中某个目录下的单独的程序,这叫做外部命令。对于用户而言,没必要关心一个命令是在shell内部还是在shell外部。

Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展(安装新的程序即可扩展命令,通过shell启动程序),其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作。Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。

shell对于命令的分析过程如下:
首先,检查用户输入的命令是否是内部命令,如果不是再检查是否是一个应用程序;
shell在搜索路径或者环境变量中寻找这些应用程序;
如果键入命令不是一个内部命令并且没有在搜索路径中查找到可执行文件,那么将会显示一条错误信息提示命令错误;
如果能够成功找到可执行文件,那么该内部命令或者应用程序将会被分解为系统调用传给Linux内核,然后内核在完成相应的工作;

shell与bash

shell是外壳程序的统称,bash 是具体的一种shell。

shell的种类

bash

bash是Linux系统默认使用的shell。bash是BourneAgain Shell的缩写,内部命令一共有40个。
bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,包括许多附加的特点。Bash 有可编辑的命令行,可以回查历史命令,支持 tab 键补齐以使用户避免输入长的文件名。
Linux使用它作为默认的shell是因为它有诸如以下的特色:
•可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。
•自动通过查找匹配的方式给出以某字符串开头的命令。
•包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。

sh

sh 由Steve Bourne开发,是Bourne Shell的缩写,各种UNIX系统都配有sh。

ash

ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
csh

C shell 使用的是“类C”语法,借鉴了 Bourne shell 的许多特点,只是内部 shell 命令集有所不同。

ksh

ksh 是Korn shell的缩写,Korn shell 的语法与 Bourne shell 相同,同时具备了 C shell 的易用特点。

tcsh

TC shell 是 C shell 的一个增强版本,与 C shell 完全兼容。

zsh

Z shell 是 Korn shell 的一个增强版本,具备 bash shell 的许多特色。

查看当前系统可以使用的shell
命令cat /etc/shells
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

查看当前使用的shell
最常用的查看shell的命令,但不能实时反映当前shell,这是系统环境中的一个变量
[jack@localhost ~]$ echo $SHELL
/bin/bash

/bin/sh是最原始的shell,现在几乎所有的linux都把bash shell设为默认的shell,即使/bin/sh 也是链接至/bin/bash

$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 10月 12 01:59 /bin/sh -> /bin/bash

参考:
http://c.biancheng.net/view/706.html
https://blog.csdn.net/qq_36119192/article/details/82964713

Linux Shell脚本 - 什么是Shell相关推荐

  1. ios重签名shell脚本_iOS逆向——shell重签名及代码注入

    感谢hank老师 上一章我们讲了应用签名原理和重签名原理,不再赘述,没有看过的同学可以点这里-- 这章概述shell脚本重签名.可能有的同学认为有很多工具都能快速的帮助我们重签名实现需求,但我更希望在 ...

  2. 【跟晓月学shell脚本】掌握shell脚本变量原理及概念

    前言 跟晓月一起学shell,死磕shell脚本,让shell脚本学习不再难. 想学习更多shell脚本的案例,可以前往我的师父的shell脚本专栏:shell脚本从入门到实战-案例篇 文章目录 前言 ...

  3. php shell脚本怎么写,Shell脚本编程入门

    一.什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do tou ...

  4. 【跟晓月学shell脚本】掌握shell脚本变量实战案例

    前言 上篇文章我们探讨了shell脚本变量的基本原理和概念,本篇我们基于上面的内容增加一些实战. 如果你还没有学习shell脚本的变量理论,可以点击链接:[跟晓月学shell脚本]掌握shell脚本变 ...

  5. linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量

    随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要.在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分.作为Linux系统 ...

  6. Linux qt shell脚本,QT执行shell脚本或者执行linux指令

    由于我在做linux下的QT开发,有时候会用到shell脚本的辅助,但是需要QT运行shell脚本并获取执行结果,今天给大家分享下我的技巧,废话少说直接上代码: //执行shell指令或者shell脚 ...

  7. linux shell脚本学习指南,shell脚本学习指南[二](Arnold Robbins Nelson H.F. Beebe著)

    该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞.汗-这个...音乐无国界嘛,这个不应该也没性别界么? 第四章文本处理工具 书中先说明了以下排序的规则,数值的就不用说了, ...

  8. linux shell脚本 引入外部shell文件

    shell脚本 引入文件 文件包含的语法格式如下: # 注意点号(.)和文件名中间有一空格 . filename # 或 source filename 实例: [root@hadoop01 shel ...

  9. linux shell脚本链接操作符,Shell脚本中的操作符

    Shell脚本中常用的操作符 算术操作 +  -  *    /    % 关系操作 >=      <=    ==    !=    &&  || 测试操作 测试命令 ...

最新文章

  1. window.opener
  2. eventproxy
  3. android gradle自定义钉钉群提醒
  4. Asp.Net CoreDocker部署到树莓派3B中
  5. python截取关键字后的字符串_使用正则表达式获取python中特定字符串之后的所有内容...
  6. 去哪儿对垒携程 在线旅游静悄悄的革命
  7. PLSQL_动态语句的解析(概念)
  8. Golang web请求
  9. Node-跟着李南江学编程
  10. react兼容safari9_react项目兼容ie浏览器配置
  11. 火狐浏览器打不开html,火狐浏览器打不开网页的原因及解决办法
  12. dz论坛php如何使用html模板,discuz模板制作 discuz怎样制作微信模板
  13. python 高德/百度/腾讯/谷歌API 与WGS84坐标互转(BD09/GCJ02/WGS84)
  14. 进击的Android之manifests
  15. NVIDIA Jetson官网资料整理
  16. 兄弟1218无线打印服务器错误,兄弟无线打印机无法打印怎么办?
  17. IBM罗睿兰的“告别信”
  18. React(Js)学习
  19. OpenCV这么简单为啥不学——1.5、解决putText中文乱码问题
  20. 第一行有一个整数,表示数字拼图个数 n。第二行有 n 个 整数,表示给出的 n 个数字拼图 上的数字ai。

热门文章

  1. Google开源框架AutoFlip 实现视频智能剪裁
  2. UDP成为低延时流媒体关键 选SRT还是QUIC?
  3. 开启HDR视觉盛宴:究竟什么视频算得上HDR?
  4. 2017年会是Serverless爆发之年吗?
  5. Direct2D的使用
  6. Raft算法和开源实现
  7. windows下,linux下c++生成文件夹
  8. 面试题SMKJ——no.1
  9. HBase性能优化方法总结(二):写表操作
  10. 个人博客 | 网站部署终极操作:一行命令搞定!