shell是什么,shell的种类有哪些(新手必看)
我们平时所说的 shell 可以理解为 Linux 操作系统提供给用户的使用界面,在本地字符界面登录后、在本地图形打开终端后、在远程连接后,我们都会得到 shell 命令解释器,因为在以上几种情况下,我们都需要以输入命令的方式来使用系统资源。
shell 为用户提供了一个可以输入命令并得到命令执行结果的环境。在用户登录系统之后,系统就根据用户在 /etc/passwd 文件中的设定,为该用户运行一个被称为 shell(外壳)的程序。
确切地说,shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求,以便运行程序的界面系统级程序,用户可以通过 shell 来启动、挂起、停止,甚至编写一些程序。shell 处于内核与用户之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。

图 1 Linux操作系统层次结构
如图 1 所示为 Linux 操作系统层次结构,shell 层接收用户输入的命令,并把用户的命令从类似“abcd”的 ASCII 码解释为类似“0101”的机器语言,然后把命令提交到系统内核处理;在内核处理完毕之后,把处理结果再通过 shell 返回给用户。
在图 1 中,Linux 操作系统内核可用于管理控制硬件,而在内核之外存在 shell 层和应用程序,在 shell 层或应用程序之外是用户。用户执行的命令会通过 shell 层转换为内核能执行的指令,并最终实现使用硬件资源的目的。同时,在系统中使用其他语言(C 语言或 Go 语言)编写的应用程序或工具,它们不使用 shell 命令解释器最终也能通过内核实现使用硬件资源的目的。
最后,在图 1 中还出现了文件系统部分。文件系统既不属于 shell 层也不属于应用程序,其是在格式化时直接写入硬盘(硬件)中的。
shell 不仅是一个命令行解释器,还是一门功能强大的编程语言,其易编写、易调试、灵活性较强。作为一种命令级语言,shell 组合功能很强,与操作系统有密切的关系,我们可以在 shell 脚本中直接使用系统命令。
与大多数的编程语言相同,shell 提供了很多特性,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。但与部分编程语言不同的是,shell 属于解释型语言,而同样作为编程语言的 C语言和 Go 语言等属于编译型语言:
因此,我们通常认为编译型语言效率更高,因为经过一次编译后,每次执行过程都不需要再编译;而解释型语言在每次运行时都要使用解释器对代码进行解释后再执行。
首先是 Bourne shell,这样命名是为了纪念此 shell 的发明者 Steven Bourne。从 1979 年起,UNIX 就开始使用 Bourne shell。Bourne shell 的主文件名为 sh,开发人员便以 sh 作为 Bourne shell 的主要识别名称。
虽然 Linux 与 UNIX 一样,可以支持多种 shell,但 Bourne shell 的重要地位至今仍然没有改变,许多 UNIX 系统中仍然使用 sh 作为重要的管理工具。它的工作从开机到关机,几乎无所不含。在 Linux 中,用户 shell 主要使用 Bash,但在启动脚本、编辑等很多工作中仍然使用 Bourne shell。
其次是 C shell。C shell 是非常流行的 shell 变种,其主要在 BSD 版的 UNIX 系统中使用,发明者是伯克利大学的 Bill Joy。C shell 因为其语法和 C语言类似而得名,这也使得 UNIX 的系统工程师在学习 C shell 时感到相当方便。
Bourne shell 和 C shell 形成了 shell 的两大主流派别,后来的变种大都吸取了这两种 shell 的特点,如 Korn、tcsh 及 Bash。
最后是 Bash,它是 GNU 计划的重要工具之一,也是 GNU 系统中标准的 shell。Bash 与 sh 兼容,因此许多早期开发出来的 Bourne shell 程序都可以继续在 Bash 中运行。目前我们使用的 Rocky Linux 9.x 就以 Bash 作为用户的默认 shell。
Bash 于 1988 年发布,在 1995—1996 年推出了 Bash 2.0。当前我们的操作系统是 Rocky Linux 9.x,默认使用的版本是 Bash 5.1.8。
下表中详细列出了 shell 各版本的具体情况:
注意,shell 的两种主要语法类型为 Bourne 和 C,这两种语法彼此不兼容。Bourne 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程度上支持 csh 的语法)。
在 Linux 中,除了可以支持 Bash,还可以支持很多其他的 shell。我们可以通过 /etc/shells 文件来查询 Linux 支持的 shell,命令如下:
在 Linux 中,这些 shell 是可以任意切换的,命令如下:
用户信息文件 /etc/passwd 的最后一列就是用户默认的 shell 类型,命令如下:
shell 为用户提供了一个可以输入命令并得到命令执行结果的环境。在用户登录系统之后,系统就根据用户在 /etc/passwd 文件中的设定,为该用户运行一个被称为 shell(外壳)的程序。
确切地说,shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求,以便运行程序的界面系统级程序,用户可以通过 shell 来启动、挂起、停止,甚至编写一些程序。shell 处于内核与用户之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。

图 1 Linux操作系统层次结构
如图 1 所示为 Linux 操作系统层次结构,shell 层接收用户输入的命令,并把用户的命令从类似“abcd”的 ASCII 码解释为类似“0101”的机器语言,然后把命令提交到系统内核处理;在内核处理完毕之后,把处理结果再通过 shell 返回给用户。
在图 1 中,Linux 操作系统内核可用于管理控制硬件,而在内核之外存在 shell 层和应用程序,在 shell 层或应用程序之外是用户。用户执行的命令会通过 shell 层转换为内核能执行的指令,并最终实现使用硬件资源的目的。同时,在系统中使用其他语言(C 语言或 Go 语言)编写的应用程序或工具,它们不使用 shell 命令解释器最终也能通过内核实现使用硬件资源的目的。
最后,在图 1 中还出现了文件系统部分。文件系统既不属于 shell 层也不属于应用程序,其是在格式化时直接写入硬盘(硬件)中的。
shell 不仅是一个命令行解释器,还是一门功能强大的编程语言,其易编写、易调试、灵活性较强。作为一种命令级语言,shell 组合功能很强,与操作系统有密切的关系,我们可以在 shell 脚本中直接使用系统命令。
与大多数的编程语言相同,shell 提供了很多特性,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。但与部分编程语言不同的是,shell 属于解释型语言,而同样作为编程语言的 C语言和 Go 语言等属于编译型语言:
- 对编译型语言来说,在对源代码进行编译之后会得到该程序的二进制代码,之后的每次运行使用其二进制代码即可;
- 解释型语言通常需要指定解释器所在位置,并且在每次运行时都需要对代码中的语句进行逐一翻译并运行。
因此,我们通常认为编译型语言效率更高,因为经过一次编译后,每次执行过程都不需要再编译;而解释型语言在每次运行时都要使用解释器对代码进行解释后再执行。
shell的分类
目前 shell 的版本有很多种,如 Bourne shell、C shell、Bash、ksh、tcsh 等,它们各有特点,下面对部分版本进行简要介绍。首先是 Bourne shell,这样命名是为了纪念此 shell 的发明者 Steven Bourne。从 1979 年起,UNIX 就开始使用 Bourne shell。Bourne shell 的主文件名为 sh,开发人员便以 sh 作为 Bourne shell 的主要识别名称。
虽然 Linux 与 UNIX 一样,可以支持多种 shell,但 Bourne shell 的重要地位至今仍然没有改变,许多 UNIX 系统中仍然使用 sh 作为重要的管理工具。它的工作从开机到关机,几乎无所不含。在 Linux 中,用户 shell 主要使用 Bash,但在启动脚本、编辑等很多工作中仍然使用 Bourne shell。
其次是 C shell。C shell 是非常流行的 shell 变种,其主要在 BSD 版的 UNIX 系统中使用,发明者是伯克利大学的 Bill Joy。C shell 因为其语法和 C语言类似而得名,这也使得 UNIX 的系统工程师在学习 C shell 时感到相当方便。
Bourne shell 和 C shell 形成了 shell 的两大主流派别,后来的变种大都吸取了这两种 shell 的特点,如 Korn、tcsh 及 Bash。
最后是 Bash,它是 GNU 计划的重要工具之一,也是 GNU 系统中标准的 shell。Bash 与 sh 兼容,因此许多早期开发出来的 Bourne shell 程序都可以继续在 Bash 中运行。目前我们使用的 Rocky Linux 9.x 就以 Bash 作为用户的默认 shell。
Bash 于 1988 年发布,在 1995—1996 年推出了 Bash 2.0。当前我们的操作系统是 Rocky Linux 9.x,默认使用的版本是 Bash 5.1.8。
下表中详细列出了 shell 各版本的具体情况:
shell 类别 | 易学性 | 可移植性 | 编辑性 | 快捷性 |
---|---|---|---|---|
Bourne shell (sh) | 容易 | 好 | 较差 | 较差 |
Korn shell (ksh) | 较难 | 较好 | 好 | 较好 |
Bourne Again (Bash) | 难 | 较好 | 好 | 好 |
POSIX shell (psh) | 较难 | 好 | 好 | 较好 |
C shell (csh) | 较难 | 差 | 较好 | 较好 |
TC shell (tcsh) | 难 | 差 | 好 | 好 |
Z shell (zsh) | 难 | 差 | 好 | 好 |
注意,shell 的两种主要语法类型为 Bourne 和 C,这两种语法彼此不兼容。Bourne 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程度上支持 csh 的语法)。
在 Linux 中,除了可以支持 Bash,还可以支持很多其他的 shell。我们可以通过 /etc/shells 文件来查询 Linux 支持的 shell,命令如下:
[root@localhost~]# vi /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
在 Linux 中,这些 shell 是可以任意切换的,命令如下:
[root@localhost~]# /bin/sh #切换到 sh sh-5.1# #sh 的提示符界面 sh-5.1# exit exit #退回到 Bash 中 [root@localhost~]# ls -l / ...省略部分输出... lrwxrwxrwx. 1 root root 7 May 16 2022 bin -> usr/bin lrwxrwxrwx. 1 root root 8 May 16 2022 sbin -> usr/sbin #命令正常执行
用户信息文件 /etc/passwd 的最后一列就是用户默认的 shell 类型,命令如下:
[root@localhost~]# vi /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ...省略部分输出... #以“:”为分隔符,最后一列为 shell 类型大家可以看到,root 用户和其他可以登录系统的普通用户的登录 shell 类型是 /bin/bash,在 Linux 中,/bin/bash 也是可登录系统的用户默认使用的 shell 类型。此外,系统中还存在系统用户和服务用户(伪用户),此类用户的 shell 类型通常是 /sbin/nologin,受 shell 类型限制不能登录系统。