Shell ? bash?

 Shell

shell 

n. (蛋、坚果、某些种子和某些动物的)壳;壳状物;炮弹

v. 炮击; 给…去壳

shell在排序算法中是希尔排序, 不过接下来要说的是它的另一个意思 " 壳 "

计算机发展到现在, 用户与计算机交互的方式还是大致两种, 图形界面 和 命令行

简单来说, 对于图形界面,用户点击某个图标就能启动某个程序

对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。例如Linux中的 ls, cd 等命令

这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。换句话说,图形界面和命令

行要达到的目的是一样的,都是让用户控制计算机。

然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核, 图形界面和命令行只是架设在用户和内核之间

的一座桥梁。 由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),这时就需要另外再开发一个程序,让用户

直接使用这个程序来间接控制计算机, 让其接收用户的操作,  并能进行简单的处理,  然后再传递给内核, 让内核处理, 这样用户就

能间接地使用操作系统内核了. 所以说在用户与系统内核之间多了一个好心的 "中间商" .

1. Shell是一个程序

用户界面和命令行就是这个另外开发的程序, 就是这个好心的中间商. 在Unix/Linux下, 这个命令行程序叫做 Shell (用C实现的) .

下图示意了shell在用户与操作系统交互中的所处的位置. 可以看到, shell就像一个壳一样介于用户与操作系统之间, 所以才根据其

" 壳 " 的特征的起名叫shell.

Shell 是怎样当好中间商的(如何连接用户和内核的) ?

如图所示, 不管什么途径, 想要操作系统内核就只有调用系统调用接口. shell也是如此

Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等.

其实, 在我们通过shell与内核交互时, Shell 程序本身的功能是很弱的, 就比如说 文件操作,  输入输出,  进程管理等都是依赖内核。

我们运行一个命令,大部分情况下 Shell 都会去调用内核提供的接口,这就是在操作内核,只是这个过程被 Shell 隐藏了起

来, 我们是感受不到的 .

Shell 能连接其它程序

在 Shell 中输入的命令, 有一部分是 Shell 本身自带的, 这叫做内置命令(或内建命令), 有一部分是其它的应用程序(一个程序就是一

个命令), 这中就叫做外部命令。例如常见的echo, kill, history, wait, anv都是内建命令, 像 ls, cd, pwd, rm ...这些本身就是一个应用

程序 .

Shell内建命令有下面这些

内建命令 作用 内建命令 作用
pstree 以树状图显示正在运行中的进程 vmstat 简单的监控Linux系统性能数据
xeyes 执行xeyes会在屏幕上出现一双大眼睛,而且眼珠会跟随你的鼠标转动 bg  将任务放在后台执行
w 提供当前登录的用户及其正在执行的进程的信息 fg 对应bg, 将任务调到前台来使用。
trap  指定在接收到信号后将要采取的动作 let  简单的计算器
seq 以指定增量从首数开始打印数字到尾数 tput 通过terminfo数据库对终端会话进行初始化和操作
apropos 在 whatis 数据库中查找字符串 set  显示或设置shell特性及shell变量
command 调用并执行指定的命令 dris  显示和清空目录堆栈中的内容
fc  修改历史命令并执行 bind  显示或设置键盘按键与其相关的功能
readonly 定义只读shell变量或函数 read  从键盘读取变量值
bg  用于将作业放到后台运行 ulimit  控制shell程序的资源
enable  启动或关闭shell内建命令 declare 声明或显示shell变量
wait 等待进程执行完后返回 builtin 执行shell内部命令
shopt 显示和设置shell操作选项 exit 退出当前的shell
jobs 显示Linux中的任务列表及任务状态 history 用于显示历史命令
help  显示帮助信息 logout 退出当前登录的Shell
export  设置或显示系统环境变量 exec  调用并执行指定的命令
env  显示系统中已存在的环境变量 unset  删除指定的shell变量或函数
kill 删除执行中的程序或工作 alias   用来设置指令的别名
type 显示指定命令的类型 unalias  删除由alias设置的别名
echo 输出指定的字符串或者变量 sh shell命令解释器

可以看到, 虽然内建命令有这么几十个了, 但却一点都不多, 功能也有限. 但是 Shell 可以调用其他的程序, 每个程序就是一个命

令, 这使得 Shell 命令的数量可以无限扩展, 其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作 .

更加方便的是, Shell 还可以让多个外部程序发生连接, 在它们之间很方便地传递数据, 也就是把一个程序的输出结果传递给另

一个程序作为输入 .

我们所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序 . Shell 就像是一个领导者, 可能并不擅

长具体去做, 但却有极强的号召力和组织能力, 这正是 Shell 的魅力所在 .

Shell 也支持编程

什么 ?? Shell不是个程序吗, 怎么还能编程 ? 

其实, Shell 支持了基本的编程元素,例如:

  • if...else 选择结构,case...in 开关语句,for、while、until 循环;
  • 变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
  • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)

这样来看的话呢,Shell 也是一种编程语言,它的 解释器 就是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和

内核的这个程序,有时候又是指 Shell 编程。 所以说, Shell也是一种编程语言. 

Shell 是一种脚本语言

如C,  C++,  Go 等都是编译型语言, 在我们拿到可执行文件之前, 源代码已经经过编译器编译, 生成了可执行文件,  就是最终我们

拿到能用的程序.  编译型语言生成的可执行文件是看不到源码的.  编译型语言的优点是, 执行速度快, 对硬件要求低,  保密性好, 

适合开发操作系统, 大型应用程序, 数据库等 .
 

如Python, JavaScript, PHP, Shell 就是解释型语言, 也叫脚本语言 . 解释型语言需要一边执行一边翻译,不会生成任何可执行文

件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完 .

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

bash

bash (Bourne Again Shell )是大多数Linux系统以及Mac OS X默认的shell,它能运行于大多数类Unix风格的操作系统之上 .

也就是说  bash, 是众多Shell中的一个版本.  即Shell 是一个解释器, bash就是其中的一个版本 .

其中在Unix / Linux最常用的几种是 Bourne Shell (sh), C Shell (csh), 和 Korn Shell (ksh),  其中bash (Bourne Again Shell)是

Bourne Shell的扩展版本, 完全向后兼容, 同时bash也包含了很多 csh 和 ksh 里的优点。bash 有很灵活和强大的编程接口,同时

又有很友好的用户界面.

总之一句话, 因为优秀, 所以才会作为大多数的默认Shell .

发布了223 篇原创文章 · 获赞 639 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41071068/article/details/103124929