文档章节

Shell概述

如比如比
 如比如比
发布于 2017/03/30 07:04
字数 3224
阅读 26
收藏 0

●概述

■Shell概述

shell是一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell有两种执行命令的方式:

    交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。

    批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

 

■几种常见的shell

由于历史原因,UNIX/Linux系统上有很多种Shell,其中比较常见的Shell脚本解释器有sh、csh、bash、ksh等,习惯上把它们称作一种Shell。

 

Thompson shell
Thompson shell是历史上第一个Unix shell,1971年由肯·汤普逊写作出第一版并加入UNIX之中。它是一个简单的命令列直译器,但不能被用来执行指令稿(Shell script)。它的许多特征影响了以后命令行界面的发展。至Version 7 Unix之后,被Bourne shell取代。
Thompson shell使用的重导向命令“<”与“>”,以及管线命令“|”影响到之后的Unix shell与MS DOS。
“shell”的名字和概念是从Unix的前身Multics发展过来的。应用程序通过shell来进行调用并被系统执行。
Thompson shell设计之处就为输入和输出重定向设计了简单的语法。在设计Multics系统时,输入输出的重定向需要用特别的命令来表示重定向开始和重定向结束,而在Unix系统中,用户只需要简单地在命令后面附加一个“<”或“>”符号,再附上文件名,shell就可以在执行命令时处理输入或输出重定向。在1971年Unix发布第一个版本时,这个语法就已经被实现了。
后来又加入了管道的功能。在道格拉斯·麦克罗伊的建议下,重定向的功能被扩展,这样一条命令的输出就可以用作另一条命令的输入。按照版本3手册,管道功能最初的语法是:
command1 >command2>
这个语法语义比较含糊,容易分不清重定向的来源和目标——系统难以分清command2是一个命令还是一个文件。到了版本4,语法就被改为了“|”和“^”符号:
command1 | command2
这个语法等同于:
command1 ^ command2
而“>”符号被改成了:
command1 > file1
这条命令会把command1的输出内容写入到文件file1中。
从Thompson shell诞生的“<”、“>”和“|”产生了深远的影响。绝大多数Unix shell和其他系统的命令行(包括DOS、OS/2、Windows等)都支持这三个符号。
Thompson shell是按照极简主义进行设计的,语法非常简单,即使是不太复杂的“if”和“goto”也需要多条命令来实现。在1975年Version 6 Unix发布之际,这个shell已经无法满足大多数编程任务的需要。
这时,PWB/UNIX的开发者,特别是约翰·马沙开始修改Thompson shell的源代码,使其更适合编程。修改之后的shell被称为PWB shell或Mashey shell,包括了高级的控制流,并引入了变量,但新功能也有所限制,以保证与Thompson shell的兼容性。
最终,在1978年,Version 7 Unix已经把默认的shell换成了Bourne shell,而1979年时BSD把默认shell换成了C shell。因为所有现代Unix系统和类Unix系统都是从Version 7 Unix和BSD继承而来,所以Thompson shell基本上已经不再被使用。但是,Thompson shell作为Ancient UNIX系统的一部分,并且开放源代码,它也被移植到了现代Unix系统中,作为历史展览而出现。

 

sh ,Bourne shell,史蒂夫·伯恩(Steve Bourne)在贝尔实验室时编写。1978年随Version 7 Unix首次发布。是Version 7 Unix默认的Unix shell,替代执行文件同为sh的Thompson shell。它的二进制程序文件在大多数Unix系统上位于/bin/sh,在很多Unix版本中,它仍然是root的默认shell。

 

ash,Almquist shell,经常被简称为 A Shell 或 ash,一种Unix shell,源自于Bourne shell,由肯尼斯·艾昆斯特(Kenneth Almquist)在SVR4上建立了这个分支。它的特色是快而且轻巧,兼容于POSIX,在后来的BSD版本上,它取代了Bourne shell。它只包含24个内部命令,因而使用起来很不方便。

 

csh ,C shell是Unix shell的一种,由以比尔·乔伊(Bill Joy) 为代表的共计47位作者在BSD系统上开发编成,共有52个内部命令。C shell脱胎于Unix第六版的/bin/sh。这种shell的语法类似于C语言,与Bourne shell相比,C shell有不少特别的功能,比如aliases(别名)、command history(命令的历史)。目前C shell已不再被广泛使用,后继者包括Tenex C shell(tcsh)、Korn shell(ksh)、GNU Bourne-Again shell(bash)。

tcsh(TENEX C Shell):是csh的增强版本,引入了命令补全等功能,在FreeBSD、Mac OS X等系统上替代了csh。

 

bash,BourneAgain Shell,Unix shell的一种,在1987年由布莱恩·福克斯(Brian Fox)和Chet Ramey为了GNU计划而共同编写完成。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWare与Android在上也有移植。1990年后,Chet Ramey成为了主要的维护者。

为Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。

bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。

 

dash,Debian Almquist shell,一种 Unix shell,兼容于POSIX标准。它比 Bash 小,只需要较少的磁盘空间,但是它的对话性功能也较少。它由 NetBSD版本的Almquist shell (ash)发展而来,于1997年,由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为 dash。

 

ksh ,Korn shell是一个 Unix shell 。它由贝尔实验室的David Korn、Eric Gisin?在二十世纪八十年代早期编写。它完全向上兼容 Bourne shell 并包含了 C shell 的很多特性,例如贝尔实验室用户需要的命令编辑。

 

Zsh ,Z Shell,是一种Unix shell,它可以用作为交互式的登录shell,也是一种强大的shell脚本命令解释器。Zsh可以认为是一种Bourne shell的扩展,带有数量庞大的改进,包括一些bash、ksh、tcsh的功能。最初版本是在1990年由Paul Falstad写成,当时他是普林斯顿大学的学生。他以普林斯顿大学助理教授邵中(Zhong Shao)的名字来命名zsh。

 

■shell与编译型语言的差异

    大体上,可以将程序设计语言可以分为两类:编译型语言和解释型语言。

 

    编译型语言

    很多传统的程序设计语言,例如Fortran、Ada、Pascal、C、C++和Java,都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。

    运行程序时,直接读取目标代码(object code)。由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高,这是编译型语言的优点。

    但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。例如,在C++里,就很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。

 

    解释型语言

    解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降。

    使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;缺点是它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有awk、Perl、Python、Ruby与Shell。

 

■什么时候使用Shell

之所以要使用Shell脚本是基于:

简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。

可移植:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。

易开发:可以在短时间内完成一个功能强大又妤用的脚本。

 

考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:

    1.资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。

    2.需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)。

    3.有跨平台(操作系统)移植需求(一般使用C 或Java)。

    4.复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。

    5.对于影响系统全局性的关键任务应用。

    6.对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。

    7.项目由连串的依赖的各个部分组成。

    8.需要大规模的文件操作。

    9.需要多维数组的支持。

    10.需要数据结构的支持,比如链表或数等数据结构。

    11.需要产生或操作图形化界面 GUI。

    12.需要直接操作系统硬件。

    13.需要 I/O 或socket 接口。

    14.需要使用库或者遗留下来的老代码的接口。

    15.私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)。

 

■Shell脚本

shell脚本(shell script),是一种为shell编写的脚本程序。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。

 

#!/bin/bash

    echo "Hello World !"

将上面的代码保存为test11.sh,并cd到相应目录:

    chmod +x ./test11.sh  #使脚本具有执行权限

 

运行脚本:

$ ./test11.sh

Hello World !

 

注意,一定要写成./test11.sh,而不是test11.sh。运行其它二进制的程序也一样,直接写test11.sh,linux系统会去PATH里寻找有没有叫test11.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test11.sh是会找不到命令的,要用./test11.sh告诉系统说,就在当前目录找。

 

作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

 

再看一个例子。下面的脚本使用 read 命令从 stdin 获取输入并赋值给 PERSON 变量,最后在 stdout 上输出:

#!/bin/bash

# Script follows here:

echo "What is your name?"

read PERSON

echo "Hello, ${PERSON}"

    运行脚本:

    chmod +x ./test12.sh

    $./test12.sh

    What is your name?

    test

    Hello, test

    $

 

第一行的#!用来指定将要使用的解释器。

bash –x shell脚本

表示执行内容

bast –n shell脚本

只检测是否有错误,不执行

© 著作权归作者所有

如比如比
粉丝 126
博文 178
码字总数 286951
作品 0
日本
程序员
私信 提问
云计算--培训课程大纲

第一阶段 Linux系统管理实战 01 打开计算机世界的大门 行业分析、计算机基础、 Windows server基础、网络基础 02 Linux基本管理 Linux安装、Linux常规命令、文本编辑器 03 Linux软件与文件系...

wy125629
2017/10/11
0
0
shell脚本学习

转载自:http://blog.csdn.net/peiyao456/article/details/64937716?ref=myread 目录(?)[+] 本文内容概述: 1>shell概述; 2>shell脚本的编写和shell的运行过程; 3>内置命令概述以及分析 4>......

qq_37694763
2017/03/22
0
0
《Linux基础知识及命令》系列分享专栏

《Linux基础知识及命令》系列分享专栏 本专题详细为大家讲解了Linux入门基础知识,思路清晰,简单易懂。本专题非常适合刚刚学习Linux的小白来学习,通过学习该专题会让你由入门达到中级的水平...

kaixin_code
2018/12/01
80
0
1、MOTO XT910 分区概述及系统文件提取、CID清空

ADB SHELL 模式下,使用 busybox df -h 查看驱动状态。(busybox需要自行安装,root机器) 分区概述如下: cat /dev/block/mmcblk1p14 > /sdcard-ext/boot.imgcat /dev/block/mmcblk1p15 > ......

枫影Xda
2012/07/02
1K
0
nginx[21944]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Ad...se)

错误概述 这个错误真的很坑人,第一次安装然后可能是启动了多起,出现这个错误,80端口被占用 解决方法 当然是 把占用80 端口的的杀掉,当然在这列就是nginx自己 Migrated to https://shelto...

聪聪小可爱
2017/04/14
13
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之访问者模式

定义 Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which......

陈年之后是青葱
昨天
9
0
PhotoShop 高级应用 : 分层云彩 - 简单闪电效果

1.创建黑白渐水平渐变图层 2.选择滤镜选项卡: 渲染--->分层云彩功能 3.将滤镜-云彩效果渲染后的图层进行反相操作 【此时出现闪电效果】 6.调整色阶,使得闪电效果更明显 7.创建剪贴蒙版:色...

东方墨天
昨天
9
0
三种实现Android主界面Tab的方式

三种实现Android主界面Tab的方式 https://www.cnblogs.com/caobotao/p/5103673.html

shzwork
昨天
9
0
java8-Optional类

背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。 1965年英国TonyHoare引入了Null引用,后续的设计语言包括Java都保持了这种设计。 一个例子 业务模型 Person 有车一族, 有Car...

春天springcarter
昨天
11
0
py 登录github时token以及cookie的应用

import requestsfrom bs4 import BeautifulSoup## 获取tokenr1 = requests.get('https://github.com/login')s1 = BeautifulSoup(r1.text,'html.parser')token = s1.find(name='input',......

子枫Eric
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部