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 .