坚持知识分享,该文章由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

linux和shell关系的更多相关文章

  1. Linux Bash Shell 快速入门

    BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     ...

  2. linux BASH shell设置字体与背景颜色

    linux BASH shell下设置字体及背景颜色的方法. BASH shell下设置字体及背景颜色  echo -e "\e[31mtest\e[41m"  \e[30m 将字 ...

  3. Linux Bash Shell入门教程

    Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...

  4. Linux和Shell教程

    文档资料参考: 参考:http://www.runoob.com/linux/linux-tutorial.html 软件下载参考: centos 下载地址:https://www.centos.or ...

  5. bash shell 关系

    linux的bash和shell关系 shell通俗理解:把用户输入的命令翻译给操作系统. shell 是一个交互性命令解释器.shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell ...

  6. Linux Bash Shell j简单入门

    BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     ...

  7. 3. Linux的shell编程

    Shell 是一个用 C 语言编写的程序, 通过 Shell 用户可以访问操作系统内核服务.它类似于 DOS 下的 command 和后来的 cmd.exe.Shell 既是一种命令语言,又是一种程序 ...

  8. 【Hadoop离线基础总结】linux的shell编程

    linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

随机推荐

  1. 课时68.id选择器(掌握)

    1.什么是id选择器? 作用:根据指定的id名称找到对应的标签,然后设置属性 格式: #id名称{ 属性:值; } 注意点: 1.每个html标签都有一个属性叫做id,也就是说每个标签都可以设置id ...

  2. C语言函数篇(三)函数参数高级设计

    在内存空间中, 1. 单位大小的数据 叫 数值 . 比如 int a; char b; ... 2. 由这些单位数据组合起来的内存, 称作 空间. 比如: 各种数组char/int a[10]; 结构 ...

  3. 004---Django简单示例

    一.MVC与MTV模型  在web开发领域里著名的MVC模式,所谓MVC就是把web应用分为模型(M).控制器(C).视图(V)三层,达到了解耦的效果. 一次完整的请求如图: 但是django用的是M ...

  4. HDFS HA 的 hdfs-site.xml

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licens ...

  5. 集合源码分析之 HashSet

    一 知识准备 HashSet 是Set接口的实现类,Set存在的最大意义区别于List就是,Set中存放的元素不能够重复,就是不能够有两个相同的元素存放在Set中,那么怎样的两个元素才算是相同的,这里 ...

  6. python面向对象(进阶篇)

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员: 类的成员可以分为三大类:字段(变量).方法.属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对 ...

  7. 微信小程序 | 49,小程序入门集锦系列文章20篇

    以下20篇文章,都是关于微信小程序的文章,以入门常见问题为主.如发现谬误,请与笔者联系. [小程序入门集锦]1,微信小程序在哪里打开 [小程序入门集锦]2,小程序商店 [小程序入门集锦]3,微信小程序 ...

  8. Ubuntu15.04 python升级到python-3.6.x

    简略记录步骤,容后补充:   sudo add-apt-repository ppa:jonathonf/python-3.6   sudo apt-get update sudo apt-get i ...

  9. C++ 11 智能指针 lamda 以及一个 围棋程序

    lamda表达式使用 char* p = "Hello world"; ,nl = ; for_each(p,p+, [&](char i){ if(i=='e') ne+ ...

  10. .net的CLR

    搜索:CLR结构图 C#所具有的许多特点都是由CLR提供的,如类型安全(Type Checker).垃圾回收(Garbage Collector).异常处理(Exception Manager).向下 ...