坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/
 
索引:
  • 什么是shell
  • shell的分类
  • shell脚本的执行方式
 
摘要:
  • 了解shell的本质是什么
  • 了解除bash这个shell之外,还有哪些shell
  • shell 脚本以及shell脚本的执行方式/区别
 
 
 
 

 
 
什么是shell
一般来说,操作系统由用户接口(User Interface)和系统内核(kernel)两部分构成
从名字可以看出,内核是操作系统的核心, 它是一个操作系统的灵魂
内核的主要作用有以下几点
  1. 文件管理 (File manager)  协调调度计算机中的大容量存储
  2. 设备驱动 (Device drivers) 使接入计算机的周边设备能相互通信
  3. 内存管理 (Memory manager) 协调调度计算机中的内存
  4. 进程调度 (Scheduler)  协调调度系统中的进程
  5. 时间调度 (Dispatcher) 给予进程CPU的使用时间
  6. 系统调用 (System calls) 进程请求系统内核去执行一些它(普通进程)没有权限执行的命令
  • 简单概括, 内核负责管理计算机硬件资源(CPU, 内存, 硬盘, 周边设备I/O)的使用
内核是如此的重要, 它对系统的稳定高效运行起到至关重要的作用.
因如此, 操作系统是不允许用户直接和内核进行交互的
它(OS)给予用户另外一个对操作系统访问的方式, 被称为用户接口(UI)
专门用于系统和用户进行交互
 
早期的计算机中,操作系统只有命令行界面(command-line interface) 简称为CLI
在英文单词中shell的中文翻译为 [壳] 表示的是用坚硬的东西保护保护内部柔软部分
用SHELL来描述命令行界面, 这个 "时髦"的说法 最早(1964 - 1965)诞生于 Multics 其中一位研发者Louis Pouzin
关于 SHELL 起源的故事, 可以点击这里浏览更多 http://www.multicians.org/shell.html  
感谢Louis Pouzin 为CLI 赋予了一个形象生动的名字 : )
 
  • 简单地概括, shell 本质应该是CLI, 它是一个让用户通过命令行来实现和系统交互的接口.
 

 
shell的分类
操作系统: CentOS release 6.9 (Final)
命令提示符 PS1 : \[\e[31m\]>\[\e[m\] (下图中红色的> 为命令提示符)
来介绍shell的分类之前, 先来介绍一下关于shell查看的几个常用操作
 
查看系统默认的shell
 
 
查看系统中拥有的shell
 
 
查看bash的版本

2014年9月, bash曾曝出一个严重的漏洞CVE-2014-6271

ShellShock Bug (特制环境变量注入攻击)
我们使用以下命令对系统进行测试
 env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
如果测试的结果只显示了 "this is a test" 表示你的系统正常, 否则你需要对bash打补丁 (以下仅针对CentOS/redhat)


Linux shell的大类有以下两种  Bourne shell 以及 C shell
首先介绍 Bourne shell 
Bourne shell 家族中有三大成员, [sh, ksh, bash]
 
[SH]
sh 其的开发者是 Stephen Bourne.
它在 V7 Unix 中作为默认shell 替代了之前使用的  Thompson shell
有意思的是,sh设置sh的许多特性依然沿用至今

Features of the Bourne shell versions since 1979 include:

  • Built-in test command – System III shell (1981)
  • # as comment character – System III shell (1981)
  • Colon in parameter substitutions "${parameter:=word}" – System III shell (1981)
  • continue with argument – System III shell (1981)
  • cat <<-EOF for indented here documents – System III shell (1981)
  • Functions and the return builtin – SVR2 shell (1984)
  • Built-ins unsetechotype – SVR2 shell (1984)
  • Source code de-ALGOL68-ized – SVR2 shell (1984)
  • Modern "$@" – SVR3 shell (1986)
  • Built-in getopts – SVR3 shell (1986)
  • Cleaned up parameter handling allows recursively callable functions – SVR3 shell (1986)
  • 8-bit clean – SVR3 shell (1986)
  • Job control – SVR4 shell (1989)
  • Multi-byte support – SVR4 shell (1989)
[Ksh]
Ksh 全称是 KornShell , 其研发者是 David Korn 
它最初的开发是基于Bourne shell的, 因此隶属于 Bourne shell的阵列中
与 sh相比, 它拥有以下的特性
[bash]
bash 的全称是 Bourne-again shell, 其开发则是GUN计划的 Brian Fox
目的是为了替代 Bourne shell 
它是Linux众多发行版和apple (最早是 OSX) 默认的shell, 现如今微软Windows10也有对其的支持
虽然bash是用作sh的替代品, 但是bash并不能完全兼容sh, 这是需要注意的.
在CentOS 6.9 中, sh 是一个连接到 bash 上的连接文件, 因此使用sh 命令和 bash命令效果是一样的
 

C Shell 家族有两个成员 [csh, tcsh]

[csh]
csh 其设计者是 Bill Joy 
由于csh拥有交互的特性, 在1980年, csh以其易于上手的特性, 赢得了青睐
csh的设计理念是使得它开起来更像是 C语言, 并且拥有更好的用户交互性

Bourne shell

#!/bin/shif [ $days -gt 365 ]then
echo This is over a year.
fi
 

C shell

#!/bin/cshif ( $days > 365 ) then   echo This is over a year.

endif
以上这个例子, 可以说明csh  与 bash 中脚本书写的差异性
就以上的脚本而言, csh的可读性略胜一筹 
 
[tcsh]
由于sh有进阶版的bash, csh也有其进阶版,名字就叫tcsh
它是BSD 相关系统的tcsh
 
简单整理一下
shell 有两大阵型 Bourne shell 与 C shell
Bourne shell (sh) --> Korn shell (ksh) 
Bourne shell (sh) --> Bourne again shell (bash)  总多Linux发行版上最流行的shell 
csh --> tcsh 如今在BSD系统上最流行的shell
 

shell 脚本的执行方式

# 执行的脚本
 
 
[第一种方式 sh script.sh]
这是一种十分常用的 shell 脚本执行方式. 因为它不需要用户给予脚本执行权限
sh 命令接收 script.sh 这个文件作为传入参数, 开启一个子shell进行命令的解析与执行
 
[第二种方式 source(.) script.sh] 
这种方式, 也不需要用户给予脚本执行权限, 脚本将直接在当前shell中执行
这意味着, 在script.sh 中定义的变量或函数, 在脚本执行结束后, 变量的值或函数返回值等将被保留
(需要注意的是, "." script.sh 这种方式只能在 bash 类型的shell中执行
而 source script.sh  既能在 bash类型 也能在 csh 类型的shell中执行)
  
[第三种方式 ./script.sh]
这种方式, 用户必须赋予脚本执行权限(chmod a+x script.sh) 
才能运行脚本, 该方式也是通过子shell对命令进行解析与执行

[关于 子shell 和 父shell]

简单来说,子shell和父shell的关系有以两点
1.子shell 会复制 父shell的变量和函数, 就如同子女继承父母的基因一样,
2.子shell中设置的变量和函数只有子shell自己知道, 子shell无法改变父shell设定的变量和函数
 
脚本执行中, 如果使用 source / . 方式执行脚本, 命令会于当前shell中解析执行
下面用一个简单的脚本来体会一下, 当前shell中执行脚本, 和子shell执行脚本的取本
 
脚本内容

 
使用当前shell执行完cd命令后, 当前shell的目录发生了变化
 
使用子shell执行完cd命令后, 当前shell的目录并没有发生改变
  
------------------------------
参考资料:
// Computer Science: An Overview (12th Edition)
 
https://www.wikiwand.com/en/Kernel_(operating_system)                                        
// Kernel (operating system)
 
// The Origin of the Shell
 
// Command-line interface
 
// Why was the word “shell” used to descibe a command-line interface?
 
// Bash specially-crafted environment variables code injection attack
 
// What is the ShellShock Bug? (September 2014)
 
// ShellShock Attack Demonstration
 
// Bourne shell
 
// KornShell
 // Bash (Unix shell)
 
// C shell
 
// tcsh
 
// Different ways to execute a shell script

[拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门的更多相关文章

  1. Shell编程-01-Shell脚本初步入门

    目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell     简单来说Shell其实就是一个命令 ...

  2. 【shell 大系】Linux Shell常用技巧

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  3. Linux Shell常用技巧(目录)

    Linux Shell常用技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html一. 特殊文件: /dev ...

  4. 【转】十分有用的linux shell学习总结

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  5. linux shell脚本之-变量极速入门与进阶(1)

    1,如果创建shell脚本? 使用任意文本编辑软件,一般为vim,创建.sh结尾的文件,在文件的最开头用 #!/bin/bash 注明shell的类型 如: ghostwu@dev:~/linux/s ...

  6. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  7. Linux SHELL中sh和bash的区别

    什么是SHELL? shell的中文意思就是贝壳,其实比较类似于我们内核的壳.简而言之就是只要能够操作应用程序的接口都能够称为SHELL.狭义的shell指的是命令行方面的软件,广义的SHELL则包括 ...

  8. linux ——shell 脚本

                                                      linux—shell 脚本  精简基础                 2018/10/30 13 ...

  9. 【shell】shell脚本入门

    1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...

随机推荐

  1. BCL和CoreFx的区别

    bcl是.netframework clr 的基础库corefx是.net core clr的基础库

  2. DJango_生命周期

    在django中,当我们访问一个url时,会通过路由匹配进入到响应的html页面中. Django的生命周期,指的就是当用户在浏览器上输入url,到用户看到整个页面之前,django后台都做了哪些事情 ...

  3. Qt创建停靠悬浮窗口

    1.Qt实现窗口停靠和悬浮使用类QDockWidget,它有两个重要方法用来设置停靠特性以及停靠区域, dw1->setFeatures(QDockWidget::DockWidgetMovab ...

  4. TurnipBit之DIY无线遥控智能小车

    一.准备工作 TurnipBit 开发板 2块 TurnipBit 扩展板 1块 数据线 1条 智能小车器件 1套 电机驱动模块(L298N) 1个 在线可视化编程 点击进入   二.思路设计   2 ...

  5. 客户端 未登录页面 (clearfix 分割线)

    做了一个手机客户端页面,未登录的状态页面 类似 如上图所示 这样 上面列表采取80%宽度,右侧浮动.ul li设置绝对定位.左边icon图标采取决定定位. 为了防止小屏幕手机左边空白缝隙过小,事先给外 ...

  6. Java学习笔记24(Integer类)

    这里介绍基本数据类型包装类,Integer是int的包装类, 其他的基本数据类型的包装类的方法和Integer的方法几乎一致,会一种即可全会 基本数据类型包装类的特点:用于在基本数据类型和字符串之间进 ...

  7. 教你用.Net来玩微信跳一跳

    目前开发的所有代码都已经上传到了GitHub.欢迎大家来Star https://github.com/GiantLiu/AutoJump 目前程序分为“全自动版本”和“半自动版本” 全自动版本 We ...

  8. [转] Web 开发模式演变历史和趋势

    文章转自梦想天空--前端文摘:Web 开发模式演变历史和趋势 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 3-5 人搞定所有开发.页面由 JSP.P ...

  9. Django-mtv开发模式

    从著名的MVC模式开始说起 所谓的MVC就是把Web应用分为模型(M)控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的房还是 连接在一起,模型负责业务对象与数据库的映射(ORM),视图负 ...

  10. 一种数据与逻辑分离的Python单元测试工具

    一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...