我们知道,Windows、Mac OS、Android 等操作系统由一家公司开发,所有的核心软件和基础库都由一家公司做决定,容易形成统一的标准,一般不会开发多款功能类似的软件。
而 Linux 是一个开源的操作系统,由多个组织机构开发,不同的组织机构为了发展自己的 Linux 分支可能会开发出功能类似的软件,它们各有优缺点,用户可以自由选择。
Shell 就是这样的一款软件(上篇文章讲到,Shell既是脚本编程语言,也是一个命令行程序,或者说一款软件),不同的组织机构开发了不同的 Shell,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验。
常见的 Shell 有sh、bash、csh、tcsh、ash等。
1、sh
(1)sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
(2)sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。
(3)sh 是第一个流行的 Shell。
2、 csh
(1)sh 之后广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,它的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
(2)Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
(3)BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连Mac OS X 在很大程度上也基于BSD。
3、tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。
4、ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。
5、bash
(1)bash shell 是 Linux 的默认 shell。
(2)bash 由 GNU 组织开发,保持对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash兼容sh ,这意味着针对sh编写的 Shell 代码可以不加修改地在 bash 中运行。
(3)但bash 和 sh也有一些不同之处。一方面,bash 扩展了一些命令和参数。另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。
“SHELL”是 Linux 系统中的一个环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用哪一个 Shell。我们可以使用“echo $SHELL”查看当前Linux 的默认 Shell。
root@ubuntu:/# echo $SHELL
/bin/bash
root@ubuntu:/#
之前提到Shell 是一个应用程序,它一般都是存放在/bin或者/user/bin目录下。
当前 Linux 系统可用的 Shell 都记录在/etc/shells这个文件中,该文件是一个纯文本文件,可以使用 cat 命令查看它。
root@ubuntu:/etc# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
root@ubuntu:/etc#
另外,在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。
root@ubuntu:/bin# ll bash
-rwxr-xr-x 1 root root 986672 May 16 2017 bash*
root@ubuntu:/bin# ll sh
lrwxrwxrwx 1 root root 4 Sep 22 2018 sh -> bash*
root@ubuntu:/bin#